递归地将文本前置到文件名

时间:2014-03-30 05:10:19

标签: linux bash rename

我希望将文本添加到特定类型的每个文件的名称前面 - 在本例中为.txt文件 - 位于当前目录或子目录中。

我试过了:

find -L . -type f -name "*.txt" -exec mv "{}" "PrependedTextHere{}" \;

问题在于处理./引用附带路径的{}部分。

感谢任何帮助或替代方法。

4 个答案:

答案 0 :(得分:3)

你可以做这样的事情

find -L . -type f -name "*.txt" -exec bash -c 'echo "$0" "${0%/*}/PrependedTextHere${0##*/}"' {} \;

哪里

  • bash -c '...'执行命令
  • $0是传入的第一个参数,在本例中为{} - 完整文件名
  • ${0%/*}删除包含文件名
  • 中最后一个/之后的所有内容
  • ${0##*/}删除文件名中最后一个/之前的所有内容

一旦您对其有效,请将替换为

答案 1 :(得分:0)

在这里快速拍摄。如果有帮助,请告诉我。

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

答案 2 :(得分:0)

您是否只是想将文件移动到之前有Prepend的新文件名?

for F in *.txt; do mv "$F" Prepend"$F"; done

或者您是否希望它处理子目录并在目录和文件名之间添加前缀:

dir1/PrependA.txt
dir2/PrependB.txt

答案 3 :(得分:0)

这应该有效,因为长文件名没有新的行字符。在这种情况下,使find使用-print0和IFS为null。

#!/bin/sh
IFS='
'
for I in $(find -L . -name '*.txt' -print); do
    echo mv "$I" "${I%/*}/prepend-${I##*/}"
done

P.S。删除回声以使脚本有效,它可以避免意外破坏那些随意将粘贴内容从此处复制到其外壳的人。