경로를 반복적으로 반복하고 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