我如何找到所有文件特定类型/名称并复制它们-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。
我仍在努力弄清楚的事情:
- 是否
find
作为循环工作或花括号在其他编程语言中被视为“列表/数组”?含义:它是否会一次性填充找到的结果(即字符串),然后传递给下的命令-exec
? - 为什么移动首先发生在上一级,然后又发生在上一级?
- 有没有办法立即告诉
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 .
(并且没有大量的文件)