ls 出力には、「N'*」というファイルが「N'\''*」と表示されます。

ls 出力には、「N'*」というファイルが「N'\''*」と表示されます。

システム:

  • Ubuntu 22.04.3 LTS
  • GNU bash、バージョン 5.1.16(1)-リリース(x86_64-pc-linux-gnu)
  • ls(GNU coreutils) 8.32

状態:

$ touch "N'*"
$ ls
'N'\''*'

GNU Coreutils - ファイル名の引用状態:

「一重引用符が付いたファイルは不可解な方法で印刷されます!」この問題はバージョン 8.26 で迅速に解決されました。

$ touch "Don't README.txt"

$ ls-8.25 

'Don'\''t README.txt'   ## version 8.25


$ ls 

"Don't README.txt"      ## version 8.26 and later
(bug22696#19)

質問:上記の例と私のファイル間の一重引用符の処理の違いを説明できる人はいますか?

答え1

これについていくつかのテストを行ってみると、lsファイル名に一重引用符が含まれている場合は、一重引用符に戻ります。そして空白以外の特殊文字です。たとえば、

$ cat fileNames
one space
one'quote
quote'and*
quote'and?

$ while IFS= read -r file; do touch "$file"; done < fileNames 

$ ls
 fileNames  "one'quote"  'one space'  'quote'\''and*'  'quote'\''and?'

開発者は、二重引用符を使用するときに失敗する可能性のあるすべての名前をキャプチャするのが複雑すぎると判断し、読み取りはより困難ですが、複雑な場合は使いやすい一重引用符に戻しました。

この例はうまくいきます(少なくとも私のシステムでは)。

$ touch "Don't README.txt"
$ ls
"Don't README.txt"

別の引用スタイルを取得するには、別の特殊文字が必要です。

$ touch "Don't README.*" "Don't README.txt"
$ ls
'Don'\''t README.*'  "Don't README.txt"

関連情報