2015-10-26 85 views
1

我有一個變量爲list_of_files的文件列表。所以,如果我運行下面的命令Bash在for循環中抱怨「沒有這樣的文件或目錄」

for file_path in $list_of_files; do 
    echo "=${file_path}=" 
done 

它給了我這個

=./a.py= 
=./b.py= 
=./c.py= 

這意味着file_path包含一個相對路徑文件,而之前或之後任何多餘的空格。

但是,如果使用cat而不是echo,它抱怨「沒有這樣的文件或目錄」

for file_path in $list_of_files; do 
    cat ${file_path} 
done 

但有趣的是,如果我叫cat直接cat ./a.py,它的工作原理。

這不是貓特有的問題。原來,如果我使用if語句檢查文件存在,它告訴我這些文件不存在。

for file_path in $list_of_files; do 
    if [ -f "$file_path" ] 
    then 
    echo 'OK' 
    else 
    echo 'NO' 
    fi 
done 

結果:

NO 
NO 
NO 

嘗試以下方法,但也失敗了。

  • 使用完整的絕對路徑
  • 從所有文件路徑
+1

野性預感 - 確保'$ list_of_files'沒有任何多餘/不合適的行結束符('\ r \ n' vs'\ n')。 – keithmo

+2

1:在腳本中添加一個「pwd」,以驗證您是否在您認爲自己的目錄中。 2:在腳本中添加一個'set -x',打印每個正在執行的命令 - 它看起來是否合理? –

+1

在腳本中有'cat。/ a.py'工作嗎? –

回答

1

的原因原來是那$list_of_files是有色刪除./。所以它包含一些用於着色目的但隱藏的特殊字符!

我發現使用echo "$list_of_files" | od -An -tcx1(感謝@BinaryZebra),它顯示所有爲文件名着色的垃圾。

通過使用sed -r "s:\x1B\[[0-9;]*[mK]::g",我排除了這些魔術位!

相關問題