将子目录中的所有文件移动到当前目录,同时重命名重复项

rvg*_*rvg 5 unix command-line mv macos

我有许多子目录,我想使用 Mac 上的一行终端命令将其中包含的所有文件移动到当前目录。我知道我的文件名并不都是唯一的,并且想在文件扩展名之前添加后缀。

\n\n

我发现了类似的问题问:将子目录中的所有文件移动到当前目录?建议使用:

\n\n
find ./*/* -type f -print0 | xargs -0 -J % mv % . \n
Run Code Online (Sandbox Code Playgroud)\n\n

但这仅对唯一的文件名有帮助。例如,给定以下树:

\n\n
.\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 bar\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 test1.jpg\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 test2.jpg\n\xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 test3.jpg\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 foo\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 test1.jpg\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 test2.jpg\n\xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 test3.jpg\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 qux\n\xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 test3.jpg\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 corge\n    \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 test3.jpg\n
Run Code Online (Sandbox Code Playgroud)\n\n

我希望看到类似于以下内容的结果:

\n\n
.\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 bar\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 foo\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 qux\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 corge\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 test1.jpg\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 test1a.jpg\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 test2.jpg\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 test2a.jpg\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 test3.jpg\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 test3a.jpg\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 test3b.jpg\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 test3c.jpg\n
Run Code Online (Sandbox Code Playgroud)\n\n

有人可以帮忙吗?

\n

Pax*_*ali 0

除非您的示例中的严格顺序命名对您来说非常重要,否则我会建议使用以下“保持简单”/“快速而肮脏”的解决方案:

find . -type f |
while read filename; do
    basename=$(basename "$filename");
    newname=$(echo "$basename" | sed "s/^\(.*\)\(\.[^\.]\+\)$/\1(XXXX)\2/");
    printf "mv \"%s\" \"%s\";\n" "$filename" "$(mktemp -u "$newname")";
done
Run Code Online (Sandbox Code Playgroud)

这只打印将要执行的命令,因此通过检查输出来检查是否健全,然后复制并粘贴到命令行中,如果一切都令您满意的话。

用英语:找到所有常规文件,将它们的文件名从“test1.jpg”转换为“test1(XXXX).jpg”形式,其中“XXXX”将被拾取并用 mktemp 替换为随机字符,然后创建“ mv”此操作的命令行。

要进一步降低文件名冲突风险,只需添加更多“X”即可。

玩得开心。