bash 使用变量查找

bash 使用变量查找

我有一个问题我不明白。它很简单,应该可以工作,但事实并非如此。 =编辑了我从终端可以看到的内容=我有一个文件名列表:

[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]$ 

没有结果,当我将其交换为 echo $i (检查变量 $i 是否正常,它有效)

[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]$ 

我究竟做错了什么?

答案1

执行一下,cat -v LIST看看是否有任何特殊字符是您通过简单的回显看不到的。我怀疑 DOS 行结尾,即换行符之前有多余的回车符。

编辑:转换列表文件:

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

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

答案2

以下作品:

$ 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 限制(这应该引发错误),您一定是做了其他错误,而这些错误不在您的示例输出中。

答案3

Cloud 您提供了文件夹 /mnt/c/e-m10/ 中列出的示例文件吗?

同时,您可以尝试以下命令吗?

for i in `cat LIST`; do echo $i; find /mnt/c/e-m10/  -iname $i -print;  done

这也会根据需要打印任何信息,它也会忽略大小写。

相关内容