我尝试过搜索类似的问题,但如果之前已经提出此类或类似问题,则无法发现任何道歉。
我正在编写一个脚本来读取带有引用号的文件名文本文件列表,然后浏览这些文件的子文件夹,然后修改名称以包含ref num。
文本文件将如下所示(制表符分隔并带有标题):
"File Name (without Extension)" "Media Number"
"AK7A7964" "01017134"
"IMG_0026" "01017192"
"106491 Anenome" "01017206"
"CW1_9449" "01017243"
我用它来清理\ t和":
的文件 cat $file | sed "1 d" | tr "\\t" "," | sed 's/\"//g' > $cleanfile
然后将cleanfile读入while循环:
INPUT=$cleanfile
OLDIFS=$IFS
IFS=,
[ ! -f $INPUT ] && { echo "$INPUT file not found"; exit 99; }
while read fname media; do
构建要修改为文件名开头的新名称
newFileName="MA_${media}_"
然后我使用以下命令对每个具有该名称的文件进行查找:
for found in $(find . -type f -name "$fname.*" ); do
但是当我尝试修改名称时,如果找到多个具有相同名称的文件,它只会改变最后的结果。
我可能错过了使用sed
执行此操作的诀窍,但我找不到很快就不会在深层发生的指南!
[编辑添加]
我在上一次do
之后做的是这样的:
获取路径和基本名称,创建新文件名,然后使用mv
替换它。我实际上只是做echo
因此它是非破坏性的
foundPath="${found%/*}"
foundFile="${found##*/}"
newFile=$newFileName$foundFile
newFilePath="${foundPath}/${newFile}"
mv $found $newFilePath
如果有多个文件名出现(就像会有的那样),那么只有mv
出现在最后一个文件名中。
答案 0 :(得分:0)
我找到的解决方案是:
find . -type f -name "${fname}.*" -exec sh -c 'for i; do name=${i##*/} path=${i%/*}; mv "$i" "$path/MA_${media}_$name"; done' _ {} +