Unix에서 for 루프를 사용하여 파일 크기 찾기

Unix에서 for 루프를 사용하여 파일 크기 찾기

다음 스크립트를 실행하여 for 루프를 사용하여 디렉터리에 있는 각 파일의 크기를 얻으려고 합니다.

#!/bin/bash
FILE=/home/cloudera/Desktop/new
for    file in $FILE
do
       size=`du -b ${file} | cut -f1`
       echo $size
done

다음 오류가 발생합니다.

du cannot access /home/cloudera/Desktop/new/a.txt 
du cannot access /home/cloudera/Desktop/new/b.txt 
du cannot access /home/cloudera/Desktop/new/c.txt

그 중 a.txt와 b.txt.c.txt는 새 디렉터리에 있는 파일입니다.

답변1

du -b대신 find와 printf를 사용하는 것이 좋습니다. 여기서 가장 큰 문제는 du가 찾은 모든 디렉토리로 재귀한다는 것입니다. 루프 for에서는 개별 파일을 볼 수 없습니다.

find /home/cloudera/Desktop/new -type f -printf "%s %p\n"

찾은 항목에 printf가 없으면 다음을 사용하십시오.

-exec stat -c "%s %n" {} \;

그런 다음 출력을 while 스크립트로 파이프합니다.

find <what you do above> | 
while read size ; do 
   # whatever
done

편집: SOURCEDIR에서 각 파일을 찾고 DESTDIR에 파일이 없거나 존재하지만 크기가 다른 경우 파일을 복사하려는 것 같습니다.

CP="echo /bin/cp -f"
sizeof() { stat -c %s "%1" ; }
cd $SOURCEDIR
find . -type f -print |
  while read name; do
    source_size=$(sizeof $SOURCEDIR/$name)
    if [[ -f $DESTDIR/$name ]]; then
      dest_size=$(sizeof $DESTDIR/$name)
      if [[ $source_size == $dest_size ]]; then
        next # do not copy
      fi
    fi
    $CP $SOURCEDIR/$name $DESTDIR/$name
  done

그러나 이것은 추악하고 느립니다. cdfind의 출력이 모두 상대 경로인지 확인해야 합니다. 이후의 사용은 $SOURCEDIR명확성을 위해 중복됩니다. 다른 이름 sizeof으로 변경할 수 있도록 별칭을 지정했습니다 du -b. 출력이 올바르면 $CP실제 명령(remove echo)으로 변경합니다.

이를 수행하는 또 다른 방법이 있습니다. 공부를 잘하면 유닉스에 대해 많은 것을 마스터하게 될 것입니다.

CP="echo cp"
{ cd $SOURCEDIR ; find . -type f -printf "%s %p\n" |sort -k 2 ; } >/tmp/source.lst
{ cd $DESTDIR   ; find . -type f -printf "%s %p\n" |sort -k 2 ; } >/tmp/dest.lst
awk 'FNR==NR { f[$2]=$1 } !length(f[$2]) || f[$2]!=$1 { print $2 }' /tmp/dest.lst /tmp/source.lst >/tmp/copythese.lst
cat /tmp/copythese.lst | xargs -n 1 -I ^ $CP $SOURCEDIR/^ $DESTDIR/^ 

시험을 봐요. 그런 다음 목록이 올바른 것으로 보이면 이전 명령 CP으로 변경하여 반복하십시오. /bin/cp -f위의 단계를 수행하지만 목록을 사용하고 있습니다. awk 명령은 대상에 없거나 크기가 다른 파일을 소스에서 찾습니다. ($1은 크기, $2는 파일 이름, $f[$2]는 파일 크기목적지). 그런 다음 의 각 행에 대해 xargs하나의 인스턴스를 실행합니다 .$CPcopythese.lst

답변2

#!/bin/bash
DIR=/home/cloudera/Desktop/new
for    file in $DIR/*
do
       wc -c "$file"
done

답변3

스크립트는 파일 또는 디렉터리일 수 있는 자체 크기(바이트)의 <SIZE> <FILE>쌍 을 표시합니다. 파일만 표시하려면 첫 번째 조건을 제거하고 두 번째 조건을 사용해야 합니다.<SIZE><FILE>

#!/bin/bash
FILE=/home/cloudera/Desktop/new

for i in `ls $FILE`
do
    if [ -d "$FILE/$i" ]
    then
        msg=`ls -ld $FILE/$i`
        size=$(echo $msg | awk -F [\ ] '{print $5}')
        file=$(echo $msg | awk -F [\ ] '{print $9}')
        echo -e "$size \t  $file"

    elif [ -f "$FILE/$i" ]
    then
        msg=`ls -l $FILE/$i`
        size=$(echo $msg | awk -F [\ ] '{print $5}')
        file=$(echo $msg | awk -F [\ ] '{print $9}')
        echo -e "$size \t  $file"
    fi
done

관련 정보