ただしteeコマンド、てめーはダメだ

2026/04/23

何様

Gitのデフォルトブランチ名がmasterからmainに変更になっているのもご時世か。ごきげんよう。

[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 始まり。

このブログを検索

ソーシャル/購読

X  Threads  note

RSS Feedly Inoreader

Threads

ブログ アーカイブ

他の年を表示する