업데이트

업데이트

경로를 통해 재귀 루프를 만들고 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        

관련 정보