(Bash 4.4および5.0を使用)
スペース、改行、およびバックスラッシュを含むファイル名に問題があります。私はしばしば次のようなコードを使用するようアドバイスを読みます。
oldIFS=$IFS
IFS=
while read -rd '' LINE ; do
...
または
while IFS= read -rd '' LINE ; do
...
しかし、この場合、IFS変数を使用する必要はないことがわかりました。明らかに次のような場合です。
次のファイルを含むディレクトリがあります。
$ ls -a1
.
..
he\llo
hello?w o r l d
listing
これ? 4番目は改行文字を表します。文書チェックリスト出力を生成するスクリプトは次のとおりです。
$ cat listing
#!/bin/bash
#IFS=
i=0
while read -rd '' FILE; do
(( i++ ))
echo -n $i" "
ls -ld "$FILE"
done
今すぐ使用-print0 | /リストこの出力をください。」
$ find -print0 | ./listing
1 drwxr-xr-x 2 pi pi 4096 Feb 15 16:34 .
2 -rw-r--r-- 1 pi pi 6 Feb 15 06:12 ./hello?w o r l d
3 -rw-r--r-- 1 pi pi 6 Feb 15 05:30 ./he\llo
4 -rwxr--r-- 1 pi pi 99 Feb 15 16:34 ./listing
本当に大丈夫です。スクリプトからIFSの前の#を削除すると、結果は同じです。チェックリスト。
したがって、ここではIFSを変更する必要はないようです。
私は角度を逃したのですか?どのような状況でIFS =が必要ですか?