我有一个如下所示的文件夹结构。
1/数据/f4aa9d39291bc37a7cacedfab656a941/x1.jpg
第一个位置和第三个位置中的随机字符串根据文件夹而变化。(假设在这个例子中,我在顶层有 30 个文件夹,以递增的方式。)
我需要将 JPG 上移两层,所以它使用这个文件夹结构并删除它数据每个目录中的文件夹如下:
1/x1.jpg
我搜索了任何可能有帮助的示例,但我认为由于通配符方面的原因,我遇到了问题。我尝试了下面的方法(请注意,我在代码中上移了一级),但没有成功。
find 1/*/data/*/. -name '*.jpg' -exec cp {} 1/* \;
任何帮助都将不胜感激。将两个元素结合起来是理想的,但我不介意只提供非删除部分的帮助,因为如果需要的话,我可能可以编写一个单独的删除脚本。
(我正在使用 macOS 的终端,如果这会对代码产生任何影响。)
答案1
如果你的目录结构是
1/data/f4aa9d39291bc37a7cacedfab656a941/x1.jpg
并且只有data
一个固定字符串,那么 find 命令中的通配符将是
find */data/* -name '*.jpg'
运行该命令并查看输出是否符合您的预期。
运行批处理脚本或命令来删除文件或目录始终是危险的。
该命令只会将文件移动到其上两级的父目录中。
find */data/* -name '*.txt' -exec bash -c 'file={};path=${file%/*};name=${file##*/};echo "mv -v $path/$name ${path%%/*}"' \;
运行该程序并查看输出是否正常。它只会打印命令行,而不会实际执行它。
要真正运行该命令,请删除该echo
命令和双引号
find */data/* -name '*.txt' -exec bash -c 'file={};path=${file%/*};name=${file##*/};mv -v $path/$name ${path%%/*}' \;
要删除空目录,命令应该是这样的,更安全一些,因为rmdir
只删除空目录。
find */data/* -name '*.txt' -exec bash -c 'file={};path=${file%/*};name=${file##*/};echo "mv -v $path/$name ${path%%/*} && rmdir -v $path && rmdir -v ${path%/*}"' \;