【问题标题】:OSX Bash: Dynamically rename files found from listOSX Bash:动态重命名从列表中找到的文件
【发布时间】:2017-02-16 15:49:11
【问题描述】:

我曾尝试搜索类似的问题,但如果之前有人问过这个或类似的问题,我找不到任何如此抱歉的内容。

我正在编写一个脚本来读取带有参考编号的文件名的文本文件列表,然后查看这些文件的子文件夹,然后修改名称以包含参考编号。

文本文件将如下所示(制表符分隔并带有标题):

"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'ing 最后一个。

【问题讨论】:

  • 如果您在循环中包含do 之后所做的事情会很有帮助。
  • 如果名称中有空格,则循环将不起作用,例如106491 Anenome
  • 您的while read 循环如何使用, 作为fnamemedia 之间的分隔符?
  • 你也不需要catsed "1 d" "$file" | tr "\\t" "," | sed 's/\"//g' > "$cleanfile"
  • @user556068 我在for found in $(find . -type f -name "$fname.*" ); do 部分更新了之后发生的事情的详细信息

标签: bash macos sed find


【解决方案1】:

我找到的解决方案是这样的:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-22
    • 1970-01-01
    • 2011-02-23
    • 2013-11-24
    • 1970-01-01
    • 1970-01-01
    • 2019-02-20
    • 1970-01-01
    相关资源
    最近更新 更多