如何在 OSX 上通过 shell 复制或移动文件 -n 级

如何在 OSX 上通过 shell 复制或移动文件 -n 级

我如何找到所有文件特定类型/名称并复制它们-n 级别上升? 这是文件系统树结构:

germany/
       |
       adventure/
                |
                300x600/
                |      |
                |      file1.jpg
                |      file2.zip
                |
                400x600/
                       |
                       file8.jpg
                       file4.zip
switzerland/
           |
           adventure/...

有很多国家/地区文件夹,大约 20 个,并且 .zip 文件不保证深度为 3 级。我目前在其父文件夹中,countries/我希望找到并复制所有。压缩文件级别,到adventure/相应的国家/文件夹的目录。

我试过:

find . -type f -name '*.zip' -exec mv {}/.. \;

但这个方法失败了。它先将每个文件上移一层,然后又将这些文件上移一层。

谢谢!

编辑: 我尝试了一下回复中的解决方案,并阅读了很多man页面 :)。最后,我接受了我最喜欢的解决方案,因为它优雅且独立于 shell。

我仍在努力弄清楚的事情:

  1. 是否find作为循环工作或花括号在其他编程语言中被视为“列表/数组”?含义:它是否会一次性填充找到的结果(即字符串),然后传递给下的命令-exec
  2. 为什么移动首先发生在上一级,然后又发生在上一级?
  3. 有没有办法立即告诉mv/cp上升/下降到-n级?

答案1

您可以使其独立于 shell 并将其压缩为一个find命令:

find . -type f -name '*.zip' -exec \
sh -c 'echo cp -- "$0" "$(dirname "$0")"/..' {} \;

echo当您确定它可以实现您想要的效果时,请将其删除。

用于find定位文件。使用 执行 shell -exec sh -c,将找到的文件{}作为第一个参数传递给该 shell。因此,shell 将具有可用的文件路径$0

然后您可以dirname "$0"使用命令替换$(…))获取文件的父目录。附加/..任意数量的目录以遍历更高目录。

请注意我文件名以防止名称中带有换行符或空格的文件被错误扩展。

答案2

使用 ubuntu zsh 5.0.2 尝试过:

for pdir in */
do
  cd $pdir
  for dir in */
  do
    cd $dir
    mv */*.zip .
    cd ..
  done
  cd ..
done

答案3

如果现实情况如给出的例子那么简单,那么只需快速选择即可:

cd germany
mv */*/*.zip .

(并且没有大量的文件)

相关内容