我希望将文本添加到特定类型的每个文件的名称前面 - 在本例中为.txt文件 - 位于当前目录或子目录中。
我试过了:
find -L . -type f -name "*.txt" -exec mv "{}" "PrependedTextHere{}" \;
问题在于处理./
引用附带路径的{}
部分。
感谢任何帮助或替代方法。
答案 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。删除回声以使脚本有效,它可以避免意外破坏那些随意将粘贴内容从此处复制到其外壳的人。