bash根据与另一个的部分匹配来更新目录中的文件名

时间:2017-03-15 12:13:12

标签: bash

我正在尝试使用bash根据数字与/home/cmccabe/Desktop/percent中其他文本文件的部分匹配,重命名/更新/home/cmccabe/Desktop/analysis.txt中文本文件的文件名。匹配将始终位于此文件的第3,4或5行中。我无法做到这一点,但希望下面的'bash`是一个开始。谢谢你:)。

/home/cmccabe/Desktop/percent 中的

文本文件 - 此目录中最多可能包含3个文件

00-0000_fbn1_20xcoverage.txt

/home/cmccabe/Desktop/analysis.txt

中的文字文件
status: complete
id names: 
00-0000_Last-First
01-0101_LastN-FirstN
02-0202_La-Fi

/home/cmccabe/Desktop/percent

中的预期结果
00-0000_Last-First_fbn1_20xcoverage.txt

的bash

for filename in /home/cmccabe/Desktop/percent/*.txt; do echo mv \"$filename\" \"${filename//[0-9]-[0-9]/}\"; done < /home/cmccabe/Desktop/analysis.txt

2 个答案:

答案 0 :(得分:1)

使用while-loop的正确Process-Substitution语法,

您可以在/home/cmccabe/Desktop/percent

下运行该脚本
#!/bin/bash
#      ^^^^ needed for associative array

# declare the associative array
declare -A mapArray

# Read the file from the 3rd line of the file and create a hash-map
# as mapArray[00-0000]=00-0000_Last-First and so on.

while IFS= read -r  line; do
    mapArray["${line%_*}"]="$line"
done < <(tail -n +3 /home/cmccabe/Desktop/analysis.txt)

# Once the hash-map is constructed, rename the text file accordingly.
# echo the file and the name to be renamed before invoking the 'mv' 
# command        

for file in *.txt; do
    echo "$file" ${mapArray["${file%%_*}"]}"_${file#*_}"
    # mv "$file" ${mapArray["${file%%_*}"]}"_${file#*_}"

done

答案 1 :(得分:1)

这是另一种类似的bash方法:

while IFS="_" read -r id newname;do
#echo "id=$newid - newname=$newname"  #for cross check 
oldfilename=$(find . -name "${id}*.txt" -printf %f)
[ -n "$oldfilename" ] && echo mv \"$oldfilename\" \"${id}_${newname}_${oldfilename#*_}\";
done < <(tail -n+3 analysis)

我们读取分析文件,并使用_作为分隔符将每一行(即00-0000_Last-First)拆分为两个字段:
ID = 00-000
newname = Last-First

然后使用此文件ID我们从文件&#34;分析&#34;我们检查(使用find)以查看是否存在以相同ID开头的文件 如果存在这样的文件,则在变量$ oldfilename中返回它的文件名 如果这个变量不是空的那么我们做mv。
tail -n + 3用于忽略文件results.txt

的前三行

Test this solution online here