${file}*.zip
次のコマンドを使用して、特定のディレクトリにあるパターンを持つファイルの圧縮を繰り返し解凍したいとします。/home/A/XML
find
find /home/A/XML -type f -name "${file}*.zip" -exec unzip '{}' -d /target/path \;
今分析したいです。ディレクトリリストただではなく/home/A/XML
for dir in "${path}"; do
find "${dir}" -name "${file}*\.zip" -type f -exec unzip '{}' -d "${dir}"/"${file}" \;
done
ループを使用してディレクトリを解析しましたが、for
最初のディレクトリの後に解凍は停止します。つまり、前のコードと同じことを行い、ディレクトリでのみ解凍されます/home/A/XML
。
caution: not extracting; -d ignored
残りのディレクトリでは、上記のエラーが発生します。誰でも私を案内できますか?よろしくお願いします。
答え1
そのディレクトリのリストが改行(1行に1つずつ)で区切られたスカラー変数に格納されている場合$path
(複数のシェルで特別なので、良い変数名ではありませんが、そうではありませんbash
)、次のことができます。
IFS=$'\n' # split on newline
set -o noglob # disable glob
for dir in $path # invoke the split+glob operator ($path unquoted)
do
find "$dir" -name "$file*.zip" -type f -exec unzip -d "$dir/$file" {} \;
done
代わりに配列の$path
場合は、ループを次のように変更します。bash
path=(dir1 dir2...)
for dir in "${path[@]}"
GNUを使用している場合、すべてのファイルを同じディレクトリにマージしたくない場合は、ディレクトリごとに1つしか成功しないように、末尾に述語またはコマンドを追加する必要がfind
あります。-quit
find
unzip
zip
オプションはオプションではなく引数の前に配置する必要があります。