というファイルにパスのリストがありますpathlist.txt
。次のようになります。
/home/abc/dirA
/home/abc/dirB
/home/abc/dir with space
/home/abc/dirX
各パスですべてのファイルを見つける必要があります。以下は機能しますが空白のないパスにのみ適用されます。
find $(tr '\n' ' ' < pathlist.txt) -type f -printf "%p, %AY-%Am-%Ad \n"
IFS=$'\n'
設定といくつかの実験を試しましたが、xargs
成功しませんでした。 findが空白(および他の特殊文字)を含むパスを許可するかどうかを確認する方法に関する提案はありますか?
答え1
1つのアプローチは次のとおりですbash
。
readarray -t a < pathlist.txt
find "${a[@]}" -type f ....
答え2
xargsのGNU実装を使用している場合は、この-d
オプションを使用して区切り文字(この場合は改行文字)を設定できます。
デモ:
xargs -d '\n' -I{} printf '<<%s>>\n' '{}' <<END
abc def
unix and linux
END
<<abc def>>
<<unix and linux>>
したがって、あなたのコマンドによる最初の試みは次のようになります。
xargs -a pathlist.txt -d '\n' -I{} -- \
find '{}' -type f -printf "%p, %AY-%Am-%Ad \n"
これには2つの問題があります。
- 交換でわかるように、複数の
find
インスタンスが実行されます。xargs -I
-L1
- 改行文字を含むファイル名にはまだ問題があります。
GNUを使用してシェルエスケープ文字列を生成すると、printf %q
最初の問題を解決できます。
find $(xargs -a pathlist.txt -d '\n' printf '%q\n') \
-type f -printf "%p, %AY-%Am-%Ad \n"
2番目のケースでは、区切り文字と見なし、\0
それxargs -0
を区切り文字として使用します。
答え3
これreadarray
は最も簡単ですが、使用しているシェルがそれをサポートしていない場合は、すべてのPOSIXシェルで機能する次の方法を試してみることができます。
while IFS= read -r pathname; do
find "$pathname" -type f
done < pathlist.txt