OSX Bash:动态重命名从列表

时间:2016-10-07 15:21:31

标签: bash macos sed find

我尝试过搜索类似的问题,但如果之前已经提出此类或类似问题,则无法发现任何道歉。

我正在编写一个脚本来读取带有引用号的文件名文本文件列表,然后浏览这些文件的子文件夹,然后修改名称以包含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出现在最后一个文件名中。

1 个答案:

答案 0 :(得分:0)

我找到的解决方案是:

find . -type f -name "${fname}.*" -exec sh -c 'for i; do name=${i##*/} path=${i%/*}; mv "$i" "$path/MA_${media}_$name"; done' _ {} +