[Linux] xargsにスペースを含むパスを渡す
エスケープしようとか思ってはいけない(1敗)(ぉ
基本方針は以下の通り。
- リダイレクト元からヌル文字区切りで送り、 xargs -0 で受ける
- xargs -I を使用する場合はプレースホルダーを "" で囲む
ヌル文字区切りで送る方法は元コマンドによって異なる。
echo
-ne "文字列\x00" で。
echo -ne "aaa bbb ccc\x00ddd eee fff\x00" | xargs -0 mkdir
find
-print0 を付与する。
find . ! -name . -type d -prune -print0 | xargs -0 rmdir
awk
スクリプト内で printf "%s\0", 文字列 で出力する。
awk '{ printf "%s\0", $0; }' dirlist.txt | xargs -0 -I{} sh -c 'mkdir "{}"; touch "{}/.keep"'
tr
\n を \0 に置換する。万能。
cat dirlist.txt | tr "\n" "\0" | xargs -0 rm -r
続きはシェルスクリプトについて。
シェルスクリプト
配列をヌル文字区切りで連結するには printf "%s\0", "${変数名[@]}" で出力する。
printf "%s\0" "${OLDDIRS[@]}" | xargs -0 rmdir
パスが格納された変数の出力の際は毎回 "" で囲むことに注意。
DIR="${FILE%/*}"
if echo "$DELLIST" | grep -qx "$DIR"; then
OLDDIRS+=("$DIR")
fi
参考
[bash] スペースが入ったファイル名の処理https://qiita.com/daei/items/76635f9fbf25824b525e
あと別件ですが、 xargs -n を使用したときのプレースホルダーは $0 始まり。





0 件のコメント: