mv:无法统计shell脚本中没有此类文件或目录


16

我编写了一个脚本,将某些文件从一个文件夹移动到另一个文件夹,但是出现以下错误,我检查了2个文件夹,并注意到1个文件夹中有此类文件,而另一个则没有此类文件,但是为什么它们都显示“ MV”无法统计没有此类文件或目录”

    mv: cannot stat `/home/esolve/project/capture/tcp_50x50/dest_folder/194.199.68.165_tcp.folder/data/*': No such file or directory
    mv: cannot stat `/home/esolve/project/capture/tcp_50x50/dest_folder/194.42.17.124_tcp.folder/data/*': No such file or directory
    mv: cannot stat `/home/esolve/project/capture/tcp_50x50/dest_folder/195.113.161.13_tcp.folder/data/*': No such file or directory
    mv: cannot stat `/home/esolve/project/capture/tcp_50x50/dest_folder/203.159.127.3_tcp.folder/data/*': No such file or directory
    mv: cannot stat `/home/esolve/project/capture/tcp_50x50/dest_folder/212.199.61.205_tcp.folder/data/*': No such file or directory
    mv: cannot stat `/home/esolve/project/capture/tcp_50x50/dest_folder/212.51.218.235_tcp.folder/data/*': No such file or directory
    mv: cannot stat `/home/esolve/project/capture/tcp_50x50/dest_folder/213.73.40.105_tcp.folder/data/*': No such file or directory
    mv: cannot stat `/home/esolve/project/capture/tcp_50x50/dest_folder/41.225.7.4_tcp.folder/data/*': No such file or directory
    mv: cannot stat `/home/esolve/project/capture/tcp_50x50/dest_folder/83.230.127.122_tcp.folder/data/*': No such file or directory
    [esolve@kitty tcp_50x50]$ ls /home/wgong/project/capture/tcp_50x50/dest_folder/194.199.68.165_tcp.folder/
    [esolve@kitty tcp_50x50]$ ls /home/wgong/project/capture/tcp_50x50/dest_folder/203.159.127.3_tcp.folder/data/
    129.88.70.226   132.187.230.1    138.96.116.22   155.185.54.250   192.38.109.144  193.136.227.163  193.175.135.61  195.113.161.13  83.230.127.122
    130.104.72.200  132.227.62.122   147.83.29.232   156.17.10.52     192.42.43.22    193.137.173.218  193.205.215.74  212.199.61.205
    131.130.69.164  132.252.152.194  148.81.140.193  157.181.175.249  192.43.193.71   193.144.21.131   193.226.19.30   212.51.218.235
    131.188.44.102  134.151.255.180  152.66.245.162  160.78.253.31    193.1.170.136   193.145.46.243   194.199.68.165  213.73.40.105
    131.254.208.10  138.48.3.203     152.81.47.4     192.114.4.3      193.136.166.56  193.166.160.98   194.42.17.124   41.225.7.4

脚本是:

    list=`ls dest_folder`
    cd dest_folder
    cwd=`pwd`
    for folder in $list;do
            mv ${cwd}/${folder}'/data/*' ${cwd}/${folder}
    done

我跑了 /home/esolve/project/capture/tcp_50x50/


1
请显示脚本的相关部分。

我更新了问题并添加了脚本,谢谢!
2013年

你需要一个添加-rmv ${cwd}/${folder}'/data/*' ${cwd}/${folder}
ProfessionalAmateur

没有-r选择的mv
余地

Answers:


25
mv ${cwd}/${folder}'/data/*' ${cwd}/${folder}

'那里的引号()防止外壳程序进行globbing。将*被逐字传递给mv命令,因为它没有找到文件名为从而未能*在指定的目录中。

更改为:

mv "${cwd}/${folder}/data"/* "${cwd}/${folder}"

(如果目录名称中带有空格,请使用双引号引起问题*。)

不过,您仍然会得到有关空目录的错误。(类似的原因:如果文件找不到与模式匹配的文件,则它将模式本身作为参数传递给命令。)


双引号有意义,但是为什么我需要*在引号之外呢?
西伯斯赌博

如果你想扩展它,你需要它外面@SibbsGambling
马太福音

8

您的代码有几个问题:

list=`ls dest_folder`

您存储的输出ls不带尾随换行符到$listls输出用换行符分隔的文件名列表。newline与文件名中的任何一个字符一样有效,因此不能可靠地使用输出。例如ls,包含的目录的输出ab包含一个名为的文件的目录的输出相同a<newline>b

 cd dest_folder

您不是要检查该命令是否失败。通常,您应该检查命令的退出状态,但是,尤其如此cd,因为其余命令假定您位于该新目录中,否则可能会产生严重后果。

cwd=`pwd`

POSIX shell已经在$PWD变量中维护了指向当前目录的(一个)路径,因此您无需在pwd此处使用(特别是在一般情况下,因为命令替换会从路径中删除尾随的换行符)。另外,mv接受相对路径,因此您无需建立绝对路径。

for folder in $list;do

Shell中的split + glob运算符不带引号。就是说,变量的内容被分割(在提到的分隔符上$IFS有特殊的空白规则),并且寻找由该分割产生的每个元素以查找通配符,以便可以将它们扩展到匹配文件列表。

在这里,您确实需要拆分,但只希望在换行符上进行拆分,并且不希望出现通配符,因此需要禁用它:

 IFS='
 '; set -f
 for folder in $list
   mv ${cwd}/${folder}'/data/*' ${cwd}/${folder}

同样,将变量不加引号的是split + glob运算符。在这里,您什么都不想要,因此您需要引用这些变量。

如前所述,通配符仅在不加引号时才扩展,您需要将其*移出引号。如果您之前使用禁用了globbing set -f,则需要set +f在调用该命令之前使用恢复它。

更好的书写方式是:

cd dest_folder &&
  for folder in */;do
    mv -- "${folder}data/"* "$folder"
  done

一些注意事项:

  • 这将排除隐藏的文件夹,并且不会从data文件夹移动隐藏的文件。
  • 我们不检查在此过程中是否覆盖了文件(您可能希望在中添加-i选项mv)。
  • 通过使用*/,我们仅循环目录,但这也包括目录的符号链接。如果您不想这样做,则需要[ -L "${folder%/}" ] && continue在循环内部添加一个。
  • 如果其中没有未隐藏的文件夹,*/则会扩展到其自身,因此您将收到一条错误消息,mv指出无法找到名为的文件*/data/*。同样,如果在任何文件夹中都没有非隐藏文件,则会收到一条that-folder/data/*不存在的错误消息。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.