【发布时间】:2014-05-09 13:09:43
【问题描述】:
我想在位于当前目录或子目录中的特定类型的每个文件(在本例中为 .txt 文件)的名称前添加文本。
我试过了:
find -L . -type f -name "*.txt" -exec mv "{}" "PrependedTextHere{}" \;
问题在于处理 {} 引用附带的路径的 ./ 部分。
感谢任何帮助或替代方法。
【问题讨论】:
我想在位于当前目录或子目录中的特定类型的每个文件(在本例中为 .txt 文件)的名称前添加文本。
我试过了:
find -L . -type f -name "*.txt" -exec mv "{}" "PrependedTextHere{}" \;
问题在于处理 {} 引用附带的路径的 ./ 部分。
感谢任何帮助或替代方法。
【问题讨论】:
【讨论】:
{} 到底在做什么?
find 命令使用它作为当前正在处理的文件名的占位符。将它放在 exec 的末尾只是将它作为参数传递给正在执行的命令。
您只是想将文件移动到一个新的文件名,该文件名之前有 Prepend?
for F in *.txt; do mv "$F" Prepend"$F"; done
或者您是否希望它处理子目录并在目录和文件名之间添加前缀:
dir1/PrependA.txt
dir2/PrependB.txt
【讨论】:
basename 和dirname 来获取文件夹和文件。
这里是一个快速的镜头。如果有帮助,请告诉我。
for file in $(find -L . -type f -name "*.txt")
do
parent=$(echo $file | sed "s=\(.*/\).*=\1=")
name=$(echo $file | sed "s=.*/\(.*\)=\1=")
mv "$file" "${parent}PrependedTextHere${name}"
done
【讨论】:
for something in $(command)。有太多的分词问题会导致语法失败(例如包含空格的文件)。见this。使用while/read 循环或他们拥有的管道示例之一进行流程替换会更好。
$'\t\n '(空格),这意味着 bash 将假定空格分隔标记,因此它将带有空格的文件名拆分为单独的标记循环而不是一个文件名。
这应该可以工作,因为长文件名没有换行符。在这种情况下,使 find 使用 -print0 和 IFS 为空。
#!/bin/sh
IFS='
'
for I in $(find -L . -name '*.txt' -print); do
echo mv "$I" "${I%/*}/prepend-${I##*/}"
done
附言删除 echo 以使脚本生效,它可以避免那些随机将粘贴内容从这里复制到他们的 shell 的人意外损坏。
【讨论】: