고쳐 쓰다

고쳐 쓰다

경로를 반복적으로 반복하고 tar.gz각 디렉터리에서 가장 최근에 생성된 파일을 가져오려면 어떻게 해야 합니까?

tar -tvf file.tar.gz각 디렉터리에서 가장 최근에 생성된 파일을 실행 하고 싶습니다.

모든 tar.gz파일은 두 번째 수준 디렉터리에 있습니다. 따라서 루프의 최대 깊이는 2입니다.

이 스크립트는 각 디렉토리를 인쇄합니다.

cd $base_dir
find . -type d -printf '%f\n'

기본 디렉터리는 이며 /var/www/bak, 모든 tar.gz 파일의 위치는 다음과 같습니다.

/var/www/bak/site1/www/file.tar.gz
/var/www/bak/site1/db/file.tar.gz
/var/www/bak/site2/www/file.tar.gz
/var/www/bak/site2/db/file.tar.gz

고쳐 쓰다

find_tarballs (){
    cd $base_dir
    find . -name \*.tar.\* -execdir sh -c "echo -n \"\${PWD}/\"; ls -t *.tar.* | head -n 1" \; | sort -u -k1,1
}

filesize (){
    ls -lh $1 | awk -F " " {'print $5'}
}

output="$(find_tarballs)"
set -- $output
shift
for tarball; do
    echo "$tarball"
    if [ ${tarball##*.} = 'gz' ]; then
        list="$(tar -tzf $tarball)"
        echo "Filesize: $(filesize $tarball), Files: $(echo "$list" | wc -l)\n"
        echo 'Press ENTER to list files...'
        read key
        echo "$list"
    else
        echo "Filesize: $(filesize $tarball)"
    fi
    echo ''
done

답변1

경로에 공백이나 개행 문자가 없다고 가정합니다.

find . -name \*.tar.\* -execdir sh -c "echo -n \"\${PWD} \"; ls -t *.tar.* | head -n 1" \; | sort -u -k1,1

모든 tarball을 찾고, 포함된 각 디렉토리에서 주어진 쉘 조각을 실행하고, 각 디렉토리에 대해 하나의 결과만 유지되도록 결과를 필터링합니다.

파일 이름에 공백이나 개행 문자가 포함되어 있지 않다고 가정하여 타르볼의 내용을 보려면 다음을 수행하십시오.

find . -name \*.tar.\* -execdir sh -c "echo -n \"\${PWD} \"; ls -t *.tar.* | head -n 1" \; | sort -u -k1,1 | tr ' ' / | xargs -n 1 tar tvf

경로와 파일 이름 사이의 공백은 "/"로 대체되고 결과는 각 파일에서 실행될 xargs프로그램 에 전달됩니다.tar tvf

각 타르볼 사이에 프롬프트를 표시하려면 다음 명령을 -p추가 하세요:xargs

find . -name \*.tar.\* -execdir sh -c "echo -n \"\${PWD} \"; ls -t *.tar.* | head -n 1" \; | sort -u -k1,1 | tr ' ' / | xargs -p -n 1 tar tvf

답변2

zsh일반적인 쓰기 전용 방식으로 를 사용하십시오 .

for dir (*/*(N/)) (){(($#)) && tar tvf $1} $dir/*.tar.gz(Nom[1])
  • for var (values) cmd: 약어for var in values; do cmd; done
  • (N/), (Nom[1]): 전역 한정자
    • N: 일치하는 항목이 없으면 nullglob으로 확장됩니다.
    • /: 디렉토리만
    • om: 수정 시간순으로 정렬(최신순)
    • [1]: 첫 번째 일치만
  • (){...} args: 매개변수가 있는 익명 함수입니다.

GNU 도구(파일 이름에 포함될 수 있는 바이트에 대해 여전히 가정하지 않지만 숨겨진 디렉터리를 탐색하고 숨겨진 tar.gz파일 포함) 및 Bourne과 유사한 셸을 사용하면 다음과 같을 수 있습니다.

LC_ALL=C find . -mindepth 3 -maxdepth 3 -name '*.tar.gz' -printf '%T@:%p\0' |
  sort -zn | LC_ALL=C awk -v RS='\0' -v ORS='\0' '
    {match($0, ":((.*)/.*)", parts); newest[parts[2]] = parts[1]}
    END {for (dir in newest) print newest[dir]}' |
    xargs -r0n1 tar tvf        

관련 정보