2016-12-07 130 views
0

我有一個包含1000個文件的文件夾。我如何重新命名文件夾中的文件

他們的名字是像下面

QET2_ P1_A1 _R2 ....

QEX2_ P2_C10 _R2 ....

QEX2_P5_B3_R2 ....

其中只有中間是非常重要的如突出顯示

和我有一個關鍵的.txt文件與此信息相同的文件夾中

Sample P R Col 
    1 1 A 1 
    2 1 A 2 
    3 1 A 3 
    4 2 A 1 
    5 2 A 2 
    6 2 C 10 
    4 2 A 1 
    5 2 A 2 

我想檢查.txt文件並相應地更改文件的名稱,或使用另一個文件夾中的名稱進行保存。例如

.._ P1_A1_ ..

應SAMPLE1因爲當我看.txt文件,它是

Sample P R Col 
    1 1 A 1 

爲..P2_C10 ..

應sample6因爲當我查看.txt文件時,它是

Sample P R Col 
    6 2 C 10 

要手動更改每個名稱,我可以舉例來說做

mv *_P1_A1* sample1 

我也嘗試過使用awk

awk '-f {print "mv *_P"$2"_"$3$4"* sample"$1}' key.txt 

做到這一點,但我無法弄清楚,

+0

以便更改是經過數唯一'A',和它對應的樣本? – choroba

+0

你能提供一個更好的樣品嗎? – choroba

+0

'爲f in *;做n = $(echo $ f | cut -d_ -f3); new_name =「sample $(grep」$ {n:0:1} \ t $ {n:1}「)。txt |頭-n1 | (未測試) – Pawamoy

回答

0

我會寫一個腳本如下,但要介意它肯定不是最高性能的解決方案:

#!/bin/bash 
keys=$(tail -n+2 key.txt | tr '\t' ' ' | tr -s ' ') 
for f in QEX*; do 
    id=$(echo "$f" | cut -d_ -f3) 
    sample=$(echo "$keys" | grep "${id:0:1} ${id:1}" | head -n1) 
    sample=${sample%% *} 
    new_name="sample$sample" 
    echo mv "$f" "$new_name" # remove the echo when you're sure it works 
done 
+0

哈哈好吧我沒有你的文件和key.txt,所以你必須適應它可能...你明白腳本?對於每個文件,得到有趣的部分(A1,P17或Q48或其他),key.txt中的grep LETTER TAB NUMBER,保留第一行(因爲有重複項),然後保留第一個字段(應該是樣本編號)。 – Pawamoy

1

您可以使用此純粹這個bash腳本:在read

while read -d $'\r' -r c1 c2 c3 c4; do 
    f="*_P${c2}_${c3}${c4}_*" 
    fname=$(compgen -G "$f") && mv "$fname" "sample$c1" 
done < key.txt 
  • -d $'\r'用於分隔在\r各行按你的問題。
  • compgen -G用於擴展bash中的glob模式。
  • 僅當compgen -G返回成功時,我們執行擴展文件名的mv
+0

它再次將它們轉換爲unix可執行文件。請注意,我正在使用Mac – nik

+1

@nik,...嗯? 「將它們轉換爲unix可執行文件」?這不是'mv'能夠做到的,這是這個代碼運行的唯一外部命令。 –

+0

@anubhava現在,它不會對此版本執行任何操作 – nik

1

僅僅依靠POSIX SH(不bash)的功能,可以做到以下幾點:

tr '\r' '\n' <key.txt | while read -r c1 c2 c3 c4 _; do 
    : c1="$c1" c2="$c2" c3="$c3" c4="$c4" 
    set -- *"_P${c2}_${c3}${c4}"* 
    if [ "$#" -eq 1 ] && [ -e "$1" ]; then 
    mv -- "$1" "sample${c1}.txt" 
    fi 
done 
+0

你的解決方案似乎正在工作,但不會改變'QEX2_P1_A1'的名字,同時你的建議是將'awk' *示例「$ 1」樣本「$ 1」key.txt到「awk」-f {system「mv * _P」$ 2「_」$ 3 $ 4「 「.txt」}'key.txt' does not work – nik

+0

@nik,我已經介紹瞭如何進行調試。如果你顯示一個在運行時開始存在的文件列表,並且用'bash -x離譜ptname',我可以看到有什麼問題。 (例如,如果包含'QEX2_P1_A1'的行沒有終止換行符,那麼會執行此操作)。 'awk'方法非常糟糕,並且容易出現安全漏洞 - 如前所述,我不支持它。 –

+0

我喜歡你的答案。然而,我很難在那裏做出一個可重複的例子。我有一個要求。我有超過10000個txt文件,我想知道他們有多少列和多少行。這是可能的與bash?例如,當我用xls文件打開它們時,我可以計算它們有多少列或它們具有的行數 – nik