Bash:循环浏览每个子文件夹中的每个文件并重命名

时间:2018-08-07 02:54:19

标签: bash

我在一个包含3个子目录的目录中:sub1sub2sub3。每个子目录中都有文件。我想通过在文件前添加sample_重命名每个文件。

这就是我所拥有的:

for d in */; do
    for f in "$d"; do
        mv "$f" "sample_$f"
    done
done

这是文件夹名称的前缀,这不是我想要的名称。我在做什么错?

谢谢!

2 个答案:

答案 0 :(得分:1)

您可以使用find和大括号扩展(shell扩展的一部分)轻松完成此操作:

find . -type f -execdir mv {,sample_}{} \;

这应该以递归方式在每个子目录中找到 个文件(-type f),然后使用-execdir选项(见下文)将它们移动(重新命名),并在{{1 }}到每个文件名。剩下的sample_Cartesian productmv {,_sample}{}方式。

  

mv {} sample_{} -execdir command {} +类似,但是指定的命令从子目录运行   包含匹配的文件,通常不是该目录中的   您开始找到的。这是一种更安全的调用方法   命令,因为它避免了路径解析期间的竞争条件   匹配的文件。与-exec选项一样,“ -exec”形式的   +将建立一个命令行来处理多个匹配文件,但是任何给定的命令调用都只会列出   存在于同一子目录中。如果使用此选项,则必须   确保您的-execdir环境变量未引用   当前目录;否则,攻击者可以运行任何他们可以使用的命令   例如将适当命名的文件保留在目录中   您将运行$PATH

GNU : Brace / Shell Expansions

答案 1 :(得分:0)

您需要使用dirnamebasename来分割文件名。

for d in */; do
    for f in $d/*; do
        mv  "$f" "$d/sample_$(basename $f)"
    done
done