使用通配符将文件向上移动两个目录然后删除目录

使用通配符将文件向上移动两个目录然后删除目录

我有一个如下所示的文件夹结构。

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%/*}"' \;

相关内容