2017-08-15 52 views
1

在有兩個目錄 finch_data/filteredfirst /對齊 與文件使文件夾從一個文件名的一部分,移動有相應的文件 - 的bash腳本

firstZBND1X.sam 
firstZBND2V.sam 
firstZBND3X.sam 
firstZBND4X.sam 
firstZBND5X.sam 

和 finch_data/filteredsec /對齊

secZBND1X.sam 
secZBND2V.sam 
secZBND3X.sam 
secZBND4X.sam 
secZBND5X.sam 

我創建了一個文件夾 finch_data/filteredsec/combined 其中我移動了所有第一個* .sam和sec * .sam文件。

現在我需要使用前綴first或sec和.sam之間的文件manes來創建單個子文件夾。因此,文件夾,如:

ZBND1X 
ZBND2V 
ZBND3X 
ZBND4X 
ZBND5X 

然後,我需要與那些名稱字符串的文件移動到這些對應的文件夾。

任何人用一行bash來做到這一點?

這是接近我是從其他論壇

find . -name "*.sam" -exec sh -c 'mkdir "${1%.*}" ; mv "$1" "${1%.*}" ' _ {} \; 

回答

3

這將做它用first(做同樣爲sec)爲前綴的文件有:

#!/bin/bash 

prefix=first 
for file in ${prefix}*; do 
    base="${file%.sam}" 
    dir="${base#$prefix}" 
    mkdir -p "$dir" 
    mv "$file" "$dir" 
done 

這不是一個可愛的oneliner ,但它可讀。但是,如果你願意,你可以把它寫成一行。

我們只是遍歷所有文件與$prefix前綴當前目錄下,通過剝離已知的擴展和已知的前綴,然後創建目錄(如果有必要,-p計算dir名,我們沒有得到,如果目錄已經警告存在),最後移動目標目錄中的文件。如果你願意,你也可以在這裏將文件重命名爲不同的東西,也許從文件名中刪除目錄名稱,等等。

+0

或者,你可以添加一個外部循環overFinch_data/filtered *;做...'然後'前綴= $ {i ## *過濾}',只是爲了調整它。 –

+0

你可以。我只想保持我的答案「不可知論的路徑」。 :) – randomir

+0

不,不,我喜歡你的答案就這樣。我剛剛發表了一條評論,加入了一個想法':)' –

相關問題