exec tar 명령과 함께 사용할 수 있도록 grep 결과를 변수에 전달하려면 어떻게 해야 합니까?

exec tar 명령과 함께 사용할 수 있도록 grep 결과를 변수에 전달하려면 어떻게 해야 합니까?

일부 정규식을 기반으로 디렉터리의 모든 폴더를 압축하려고 하므로 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 extglobBash()에서 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

관련 정보