`ls`はbashスクリプトの内部と外部で異なる動作をします。

`ls`はbashスクリプトの内部と外部で異なる動作をします。

私はシノロジーNASを使用しています。削除するファイルのリストがあり、ファイル名にフルパスが一覧表示されますMyfiles.txt。ファイルには約3000行があり、次のようになります。

"/volume2/NBU/Downloads/AA_To be seen/Life.Itself.2018.1080p.WEB-DL.DD5.1.H264-FGT/RARBG.txt"
"/volume2/nbU/Downloads/AA_To be seen/Find.Me.in.Paris.S01.WEBRip.x264-ION10/Find.Me.in.Paris.S01E16.High.Stakes.Hip.Hop.WEBRip.x264-ION10.mp4"
"/volume2/NBU/Downloads/AA_To be seen/Find.Me.in.Paris.S01.WEBRip.x264-ION10/Find.Me.in.Paris.S01E14.Time.to.Face.the.Music.WEBRip.x264-ION10.mp4"

次のスクリプトを使用しています(ls後で交換するようにテストされていますrm -f)。

#!/bin/bash
while IFS="" read -r p;
do
  ls "$p"
done < "Myfiles.txt"

残念ながら、スクリプトを実行すると、ループごとに次のメッセージでエラーが発生します。

ls: cannot access "/volume2/NBU/Downloads/AA_To be seen/Life.Itself.2018.1080p.WEB-DL.DD5.1.H264-FGT/RARBG.txt": No such file or directory
ls: cannot access "/volume2/NBU/Downloads/AA_To be seen/Find.Me.in.Paris.S01.WEBRip.x264-ION10/Find.Me.in.Paris.S01E16.High.Stakes.Hip.Hop.WEBRip.x264-ION10.mp4": No such file or directory
ls: cannot access "/volume2/NBU/Downloads/AA_To be seen/Find.Me.in.Paris.S01.WEBRip.x264-ION10/Find.Me.in.Paris.S01E14.Time.to.Face.the.Music.WEBRip.x264-ION10.mp4": No such file or directory

ただし、コマンドラインから直接その行を実行すると機能します。たとえば、

ll "/volume2/NBU/Downloads/AA_To be seen/Find.Me.in.Paris.S01.WEBRip.x264-ION10/Find.Me.in.Paris.S01E14.Time.to.Face.the.Music.WEBRip.x264-ION10.mp4"

出力は次のとおりです。

-rwxrwxrwx+ 1 Pansysadmin users 275337817 Dec 15  2018 /volume2/NBU/Downloads/AA_To be seen/Find.Me.in.Paris.S01.WEBRip.x264-ION10/Find.Me.in.Paris.S01E14.Time.to.Face.the.Music.WEBRip.x264-ION10.mp4

実行スクリプトを使用してもsudo同じエラーが発生します。

私は何を見落としていますか?

ベストアンサー1

引用符はファイル名の一部ではありません。のようなファイルを削除しようとしていますが、"file.txt"ファイル名は実際にはですfile.txt

touch "file.txt"    # shell uses quotes; name is simply file.txt
ls "file.txt"       # quotes used by shell; success
ls file.txt         # no quotes; success
ls '"file.txt"'     # outer quotes used by shell to treat word-with-quotes as literal; failure

ファイル名が正しく(つまり、ファイル名の周りに二重引用符がないように)、ファイル名を変更するか、ループを変更してデータの誤った部分を削除してください。

試してみたばかりのコメントを見ましたsudosudoなぜ必要なのかまず理解しないで、それに頼らないでください。 (ここでは必要ありません。)そうしないと、ある日システムが提供しようとした保護機能を誤ってバイパスし、システムが損傷する可能性があります。

おすすめ記事