我有一个问题我不明白。它很简单,应该可以工作,但事实并非如此。 =编辑了我从终端可以看到的内容=我有一个文件名列表:
[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
这也会根据需要打印任何信息,它也会忽略大小写。