我在一个包含3个子目录的目录中:sub1
,sub2
和sub3
。每个子目录中都有文件。我想通过在文件前添加sample_
重命名每个文件。
这就是我所拥有的:
for d in */; do
for f in "$d"; do
mv "$f" "sample_$f"
done
done
这是文件夹名称的前缀,这不是我想要的名称。我在做什么错?
谢谢!
答案 0 :(得分:1)
您可以使用find
和大括号扩展(shell扩展的一部分)轻松完成此操作:
find . -type f -execdir mv {,sample_}{} \;
这应该以递归方式在每个子目录中找到 个文件(-type f
),然后使用-execdir
选项(见下文)将它们移动(重新命名),并在{{1 }}到每个文件名。剩下的sample_
是Cartesian product的mv {,_sample}{}
方式。
mv {} sample_{}
与-execdir command {} +
类似,但是指定的命令从子目录运行 包含匹配的文件,通常不是该目录中的 您开始找到的。这是一种更安全的调用方法 命令,因为它避免了路径解析期间的竞争条件 匹配的文件。与-exec
选项一样,“-exec
”形式的+
将建立一个命令行来处理多个匹配文件,但是任何给定的命令调用都只会列出 存在于同一子目录中。如果使用此选项,则必须 确保您的-execdir
环境变量未引用 当前目录;否则,攻击者可以运行任何他们可以使用的命令 例如将适当命名的文件保留在目录中 您将运行$PATH
。
答案 1 :(得分:0)
您需要使用dirname
和basename
来分割文件名。
for d in */; do
for f in $d/*; do
mv "$f" "$d/sample_$(basename $f)"
done
done