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

現在のディレクトリのすべてのディレクトリをディレクトリごとに1つの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

関連情報