Bash

bash 使用變數查找

  • September 19, 2014

我有一個我不明白的問題。它很簡單,應該可以工作,但事實並非如此。=編輯了我從終端看到的內容=我有一個文件名列表:

[molni@archlinux picasa_album]$ cat LIST
IMG_9282.JPG
IMG_9287.JPG
IMG_9300.JPG
IMG_9324.JPG
IMG_9329.JPG
IMG_9463.JPG
IMG_9412.JPG
IMG_9562.JPG
IMG_9511.JPG
IMG_9607.JPG

並希望通過 find 命令搜尋其路徑列表中的每個文件:

[molni@archlinux picasa_album]$ for i in `cat LIST`; do find /mnt/c/e-m10/  -name "$i";  done
[molni@archlinux picasa_album]$ 

沒有結果,當我把它換成迴聲 $ i (to check if variable $ 我很好,它有效)

[molni@archlinux picasa_album]$ for i in `cat LIST`;do echo "$i" ;  done
IMG_9282.JPG
IMG_9287.JPG
IMG_9300.JPG
IMG_9324.JPG
IMG_9329.JPG
IMG_9463.JPG
IMG_9412.JPG
IMG_9562.JPG
IMG_9511.JPG
IMG_9607.JPG
[molni@archlinux picasa_album]$ 

當我手動執行此操作時,設置變數(無循環)它可以工作:

[molni@archlinux picasa_album]$ i=IMG_9607.JPG
[molni@archlinux picasa_album]$ find /mnt/c/e-m10/ -name "$i"        
/mnt/c/e-m10/IMG_9607.JPG
[molni@archlinux picasa_album]$ 

我究竟做錯了什麼?

執行 acat -v LIST以查看是否有任何通過簡單回顯看不到的特殊字元。我懷疑 DOS 行結尾,即在換行之前有多餘的輸入。

編輯:轉換 LIST 文件:

dos2unix < LIST > LIST.new && mv LIST.new LIST

或者如果你沒有 dos2unix,但有 vim: vim LIST, then :set notx, then:wq

以下作品:

$ mkdir /tmp/test
$ cd /tmp/test
$ cat > LIST << EOD
> IMG_9324.JPG
> IMG_9329.JPG
> IMG_9463.JPG
> IMG_9412.JPG
> IMG_9562.JPG
> IMG_9511.JPG
> IMG_9607.JPG
> EOD
$ mkdir e
$ touch e/IMG_9607.JPG
$ touch e/IMG_9412.JPG
$ find .
.
./e
./e/IMG_9412.JPG
./e/IMG_9607.JPG
./LIST
$ for i in `cat LIST`; do find e/  -name "$i";  done
e/IMG_9412.JPG
e/IMG_9607.JPG
$ 

因此從上面開始,然後將 LIST 替換為實數,然後e/. 如果您沒有達到 for 循環的內部 Bash 限制(這應該會引發錯誤),那麼您一定是在做其他錯誤,這不在您的範例輸出中。

引用自:https://unix.stackexchange.com/questions/156367