일부 정규식을 기반으로 디렉터리의 모든 폴더를 압축하려고 하므로 grep을 사용하여 출력을 필터링하고 있습니다. 이제 tar와 폴더 이름을 사용해야 합니다.
예를 들어, 각 최상위 디렉토리를 .tar.gz로 자체 아카이브로 만들고 싶습니다. 디렉토리 이름은 "web_"으로 시작해야 하며 ".tar.gz"로 끝날 수 없습니다.
다음과 같이 grep 출력을 varibel로 캡처하려면 어떻게 해야 합니까?
find . -maxdepth 1 -mindepth 1 -type d -print | grep -v \.tar\.gz$ | grep ^\./web_ | exec tar -czf $name.tar.gz $name
또는 ls -h를 사용하세요.
ls -h | grep -v \.tar\.gz$ | grep ^web_ | exec tar -czf $name.tar.gz $name
"찾기..."를 선택하세요:
root@4a94aef49e3a:/home# find . -maxdepth 1 -mindepth 1 -type d -print | grep -v \.tar\.gz$ | grep ^web_
./web_demozip1
./web_demozip2
"ls -h"를 선택하십시오:
root@4a94aef49e3a:/home# ls -h | grep -v \.tar\.gz$ | grep ^web_
web_demozip1
web_demozip2
예:
# fixed name works but its overwrite itself so I need to catch a var from grep
ls -h | grep -v \.tar\.gz | grep ^_web | exec tar -czf web_demozip1.tar.gz web_demozip1
root@4a94aef49e3a:/home# pwd
/home
root@4a94aef49e3a:/home# tree .
.
├── web_demozip1
│ └── somefile.txt
├── web_demozip1.tar.gz
└── web_demozip2
└── somefile.txt
답변1
find
결과를 필터링하는 데 사용할 필요는 없습니다 grep
. 대신 필터 기능을 사용하세요 find
.
find . -maxdepth 1 -mindepth 1 -type d \
-name 'web_*' \
-exec tar czf {}.tar.gz {} \;
find
필터링은 를 사용하여 수행할 수도 있지만 regex
예제에서는 필요하지 않습니다. 바라보다여기그것을하는 방법.
답변2
현재 디렉토리의 모든 디렉토리를 디렉토리당 하나의 tarball로 아카이브하려면 쉘 루프를 사용합니다:
for dir in ./web_*/; do
tarname=${dir%/}.tar.gz
tar -czf "$tarname" "$dir"
done
glob()의 후행 슬래시는 ./web_*/
디렉터리에만 일치하도록 만들고 ${dir%/}
해당 접미사가 제거된 문자열을 반환하며 디렉터리에서 이와 같이 호출하는 것은 아마도 오류일 것입니다.
.tar.gz
우리는 이미 디렉토리만 보고 있고 이것이 파일일 수 있기 때문에 접미사를 기반으로 이름을 확인하는 조건을 제거했습니다 . 이와 같은 이름의 디렉토리가 있는 경우 이를 [[ $dir == *.tar.gz/ ]] && continue
루프의 첫 번째 줄로 추가할 수 있습니다. (Bash/ksh/zsh에서)
더 복잡한 패턴을 원한다면 shopt -s extglob
Bash()에서 Ksh 스타일 확장 글로브를 살펴보거나 zsh에서 zsh의 자체 확장 글로브를 살펴보세요.
답변3
xargs 사용
또한 XARGS를 사용할 수 있다는 것을 알았습니다. 이것이 좋은 접근 방식인지 확실하지 않으므로 의견을 통해 이에 대한 귀하의 생각을 알려주십시오. @ilkkachu 또는 @pLumo 솔루션을 사용해야 한다고 확신하지만 이것이 가능하다는 것을 증명하기 위해 다음을 수행합니다.cdate=$(date '+%Y-%m-%d-%H-%M')
ls -h | grep -v \.tar\.gz$ | grep ^web_ | xargs -I {} tar -czf {}_$cdate.tar.gz {}
그러면 다음이 출력됩니다.
root@4a94aef49e3a:/home# tree .
.
├── web_demozip1
│ └── somefile.txt
├── web_demozip1_2021-08-23-14-43.tar.gz
├── web_demozip2
│ └── somefile.txt
├── web_demozip2_2021-08-23-14-43.tar.gz
├── web_ spacedir3
│ └── somefile.txt
└── web_ spacedir3_2021-08-23-14-43.tar.gz