셸 -- 파일 조작 1

7006 단어
1. 디 렉 터 리 를 옮 겨 다 니 며 모든 파일 을 찾 고 각 파일 의 줄 수 를 집계 합 니 다.
함수 detect 를 정의 합 니 다. 하위 디 렉 터 리 로 재 귀적 으로 작업 할 수 있 도록 합 니 다.
이 어 'ls $1' 을 반복 한 결과, $1 은 첫 번 째 입력 매개 변수 이 며, 경 로 를 찾 습 니 다.
순환 중, 먼저 파일 이 디 렉 터 리 파일 인지 아 닌 지 를 판단 하고, 만약 그렇다면, 안쪽 으로 귀속 하고,
그렇지 않 으 면 wc 명령 으로 파일 의 줄 수 를 얻 고, cut 명령 으로 wc 결과 의 줄 수 를 얻 으 며, 마지막 으로 결 과 를/home/user/shell/resl. txt 에 저장 하면 됩 니 다.
마지막 으로 이 함 수 를 호출 하 세 요.
#!/bin/sh
function detect(){
for file in `ls $1`
do
if [ -d $1"/"$file ]
then
  detect $1"/"$file
else
  wc -L $1"/"$file | cut -d' ' -f 1-2>> /home/user/shell/result.txt
fi

done
}
path="/home/user/"
detect $path

wc 명령
wc 즉 wordcount 로 파일 에 대한 정 보 를 통계 할 수 있 습 니 다.
  • - l 옵션 통계 줄 수
  • - c 통계 바이트 수
  • - w 통계 글자 수, 글 자 는 빈 칸, 줄 바 꾸 기 등 으로 구분
  • - L, 가장 긴 줄 의 길이 (문자 개수, 예 를 들 어 aaa 길이 3)
  • 출력 파일 이름root@ubuntu:/home/user/shell# wc -l t.sh 15 t.sh
    그래서 15 를 받 으 려 면 컷 명령 을 사용 해 야 돼 요.
    ls - l | wc - l 현재 경로 에서 파일 총 수 를 통계 할 수 있 습 니 다.
    cut 명령
  • - b 바이트 단위 로 나 뉘 는데 주의해 야 할 것 은 wc 에 - b 옵션 이 없습니다
  • - c 는 문자 단위 로 나 뉘 는데 느낌 과 - b 의 차이 가 많 지 않 습 니 다. 모든 문 자 는 하나의 바이트 로 저장 되 어 있 습 니 다. '\t' 와 같은 것 도 그 렇 잖 아 요
  • - d 사용자 정의 구분자, 빈 칸 이나 문자 같은 것
  • - f 와 - d 가 합작 하여 분할 구역 의 어느 부분 을 표시 할 지 지정 하고 분할 부분의 번 호 는 1 부터
  • a x dd
    bb x zz
    ccc x dd
    root@ubuntu:/home/user/shell# cut -d'x' -f2 ls
     dd
     zz
     dd
    root@ubuntu:/home/user/shell# cut -d'x' -f1,2 ls
    a x dd
    bb x zz
    ccc x dd
    
    root@ubuntu:/home/user/shell# cut -d' ' -f1-3 ls
    a x dd
    bb x zz
    ccc x dd
    

    - d 뒤 에는 '따옴표 안에 사용자 정의 구분자 가 채 워 져 있 습 니 다. 위 에 문자 x 와 빈 칸 을 실험 하 였 습 니 다. - f 뒤 에는 숫자 와 함께 출력 영역 을 표시 합 니 다.
    출력 영역 이 연속 적 인 두 영역 이 라면 분리 자 는 출력 할 때 도 출력 됩 니 다!변 수 를 분할 입력 으로 하려 면 어떻게 써 야 합 니까?echo 명령 으로
    var="abc x ec x dd"
    echo $var | cut -d'x' -f1,2
       abc x ec 
    

    파일 을 입력 하려 면 마지막 에 파일 경 로 를 추가 하면 됩 니 다!
    root@ubuntu:/home/user/shell# cut -c 1-5 /home/user/shell/ls
    a x d
    bb x 
    ccc x
    

    2. 파일 을 읽 고 줄 마다 옮 겨 다 니 기
    다음 파일 을 읽 고 줄 마다 옮 겨 다 니 며 줄 마다 첫 번 째 숫자 를 가 져 온 후 누적 합 니 다.
    #!/bin/sh
    path="/home/user/shell/result.txt"
    sum=0 
    while read myline 
    do
      num=`echo $myline |cut -d' ' -f1`
      echo $num  
      sum=`expr $num + $sum`   
    done < $path
    echo "sum is "$sum 
                 
    이것 은 일종 의 방식 이다. 즉,
    while read line
    do
    done < file
    아래 와 같은 방식 으로 모두 가능 하 다.
    cat file | while read line
    do 
    done
    이상 하 게 도 위 에서 이 스 크 립 트 를 실행 하고 마지막 으로 출력 한 sum 은 0 입 니 다. 부 은 줄 모 르 고 이상 합 니 다!순환 안의 갑 작 스 러 운 부분 변수 가 된 것 일 까?그리고 고치 면 소 용 없어 요?
    3. 폴 더 의 파일 접미사 이름 을 bat 로 변경
    이름 변경 은 뮤 직 비디오 로 작 동 합 니 다. 뮤 직 비디오 작업 은 이름 을 바 꾸 거나 파일 을 이동 할 수 있 습 니 다.
    #!/bin/sh
    path="/home/user/data"
    for file in `ls $path`
    do
      new_file=${file%.*}".bat"
      if [ ! -e $path"/"$new_file ]
      then
      mv $path"/"$file $path"/"$new_file
      fi
      tmp=$(date +%Y%m%d:%H%M%S)
      tmp2=`date +%Y`
     echo $tmp $tmp2 
    done
    

    화면 음악 명령
    mv [옵션] 원본 파일 이나 디 렉 터 리 대상 파일 이나 디 렉 터 리
    화면 음악 명령 의 두 번 째 매개 변수 형식 이 다 릅 니 다 (대상 파일 입 니까? 대상 디 렉 터 리 입 니까?). 화면 음악 명령 은 파일 이름 을 바 꾸 거나 새 디 렉 터 리 로 옮 깁 니 다.두 번 째 매개 변수 형식 이 파일 일 때 뮤 직 비디오 명령 이 파일 이름 을 바 꿉 니 다. 이 때 원본 파일 은 하나 (원본 디 렉 터 리 이름 일 수도 있 습 니 다) 만 있 을 수 있 습 니 다. 원본 파일 이나 디 렉 터 리 를 주어진 대상 파일 이름 으로 바 꿉 니 다.두 번 째 매개 변수 가 존재 하 는 디 렉 터 리 이름 일 때 원본 파일 이나 디 렉 터 리 매개 변 수 는 여러 개 일 수 있 습 니 다. 뮤 직 비디오 명령 은 각 매개 변수 가 지정 한 원본 파일 을 대상 디 렉 터 리 로 옮 길 수 있 습 니 다.크로스 파일 시스템 에서 파일 을 이동 할 때 뮤 직 비디오 는 먼저 복사 한 다음 에 기 존 파일 을 삭제 하고 이 파일 로 연 결 된 링크 도 잃 어 버 립 니 다.
    여러 파일 을 한 디 렉 터 리 로 이동 하면:
    mv srcfile1 srcfile2 ...  dstdir
    혹은
    mv -t dstdir srcfile1 srcfile2 ...
    아래 와 같다
    root@ubuntu:/home/user/shell# ls
    d.sh  ls  result.txt  t2.sh  test2.sh  t.sh
    root@ubuntu:/home/user/shell# mkdir dir
    root@ubuntu:/home/user/shell# mv t.sh t2.sh dir
    root@ubuntu:/home/user/shell# ls
    dir  d.sh  ls  result.txt  test2.sh
    root@ubuntu:/home/user/shell# ls dir
    t2.sh  t.sh
    root@ubuntu:/home/user/shell# cd dir
    root@ubuntu:/home/user/shell/dir# ls ../
    dir  d.sh  ls  result.txt  test2.sh
    root@ubuntu:/home/user/shell/dir# mv -t ../ t.sh t2.sh
    root@ubuntu:/home/user/shell/dir# ls
    root@ubuntu:/home/user/shell/dir# ls ../
    dir  d.sh  ls  result.txt  t2.sh  test2.sh  t.sh
    root@ubuntu:/home/user/shell/dir# 
    

    차단 명령
    ${file#*/}:       첫 번 째/왼쪽 문자열 제거: dir 1/dir 2/dir 3/my. file. txt
    ${file##*/}:    마지막/왼쪽 문자열 제거: my. file. txt
    ${file#*.}:       첫 번 째. 왼쪽 문자열 빼 기: file. txt
    ${file##*.}:    마지막 문자열 을 제거 합 니 다. 왼쪽 문자열: txt
    ${file%/*}:     마지막/오른쪽 문자열 제거:/dir 1/dir 2/dir 3
    ${file%%/*}: 첫 번 째/오른쪽 문자열 을 제거 합 니 다: (빈 값)
    ${file%.*}:    마지막 문자열 을 제거 합 니 다. 오른쪽 문자열:/dir 1/dir 2/dir 3/my. file
    ${file%%. *}: 첫 번 째 문자열 을 제거 합 니 다. 오른쪽 문자열:/dir 1/dir 2/dir 3/my
    기억의 방법 은:
          #왼쪽 을 빼 는 거 예요.
          %오른쪽 을 빼 는 거 예요.%% 첫 번 째.
    쓰 는 순서 에 주의 하 세 요. * 왼쪽 에 놓 는 지 오른쪽 에 놓 는 지 * 와% 에 따라 달라 집 니 다. * 라면 왼쪽 을 자 르 기 때문에 왼쪽 에 놓 고% 오른쪽 을 자 르 기 때문에 오른쪽 에 놓 습 니 다.
    날짜 명령
    포맷 에 있 는 +% Y..., + 번호 뒤에% 를 바짝 붙 여 주세요. 그렇지 않 으 면 오류 가 발생 합 니 다!위의 예 는 바로 년 월 일: 시 분 초 이다.
    4. 파일 이름 을 입력 하여 현재 디 렉 터 리 에 존재 하 는 지 여 부 를 판단 합 니 다.
    #!/bin/sh
    filepath=$(pwd)
    echo $filepath
    echo "read a file name:"
    read name
    if [ -e $filepath"/"$name ]
    then
      echo "exist"
    else
      echo "not exist"
    fi
    

    현재 디 렉 터 리 는 pwd 명령 으로 얻 을 수 있 습 니 다. $() 명령 의 결 과 를 얻 을 수 있 습 니 다.
    예 를 들 어 $(expr 1 + 2)
    나 는 현재 디 렉 터 리 를 가 져 오 라 는 명령 을 본 적 이 있다. $0 은 현재 스 크 립 트 파일 이름 이지 만 실제로 실 행 될 때, 예 를 들 어 나 는 t. sh 이다.
    실행 중 명령 을 두 드 립 니 다./t. sh
    그러면 $0 은.../t. sh 입 니 다. 그래서 $(dirname $0) 는 바로 "..."입 니 다. 바로 현재 디 렉 터 리 잖 아 요.그럼 cd 는 무슨 의미 가 있 을까요?이상 하 네.
    좋 습 니 다. 확실히 의미 가 있 습 니 다. 예 를 들 어 제 셸 파일 은/home/user/shell 에 놓 여 있 습 니 다.
    이 셸 파일 을/home/user 에서 실행 합 니 다.
    #!/bin/sh
    filepath=$(dirname $0)
    echo $filepath
    cd $(dirname $0)
    filepath2=$(pwd)
    echo $filepath2
    pwd
    echo "read a file name:"
    read name
    if [ -e $filepath2"/"$name ]
    then
      echo "exist"
    else
      echo "not exist"
    fi
    
    root@ubuntu:/home/user# ./shell/t.sh
    ./shell
    /home/user/shell
    /home/user/shell
    read a file name:
    t.sh
    exist

    $0 은.../shell/t. sh 이기 때문에 dirname $0 은.../shell, cd./shell 도 셸 디 렉 터 리 에 들 어 갑 니 다.
    "."는 현재 디 렉 터 리 이 고 셸 은 현재 디 렉 터 리 의 하위 디 렉 터 리 이기 때문에 현재 디 렉 터 리 의 셸 하위 디 렉 터 리 에 들 어 갑 니 다.
    cd/shell 로 쓰 면 "/"는 루트 디 렉 터 리 를 대표 합 니 다!!
    cd.. 현재 디 렉 터 리 에 들 어 가 는 부모 디 렉 터 리 입 니 다.
    실행 중인 해유 의 이상 한 문 제 는 내 가 cd 명령 과 pwd 명령 을 합 쳐 쓰 면 cd 명령 이 실행 되 지 않 는 다 는 것 이다. 이상 하 다.

    좋은 웹페이지 즐겨찾기