將檔案分類到主目錄的不同目錄中

將檔案分類到主目錄的不同目錄中

我有許多檔案試圖從主目錄移動到內部有多個子目錄的單獨目錄。

範例檔案命名約定 1SA_1BA_1W.out、2SA_3BA_3W.out、4SA_2BA_5W.out...有沒有一種方法給出每個 SA、BA、W 或其他項目的編號,我必須一次將所有項目移至給定位置。 SA 的範圍是 1-10,BA 1-4 等...目前我正在使用腳本命令,例如......

find . -type f -name '1A_1HNO3_W.out' | xargs -I {} cp '{}' /location/A_HNO3
find . -type f -name '2SA_BA_W.out' | xargs -I {} cp '{}' /location/SA_BA_W 
find . -type f -name '3SA_BA_W.out' | xargs -I {} cp '{}' /location/SA_BA_W 
find . -type f -name '4SA_BA_W.out' | xargs -I {} cp '{}' /location/SA_BA_W 
find . -type f -name '1SA_DEA_W.out' | xargs -I {} cp '{}' /location/SA_DEA_W 
find . -type f -name '2SA_DEA_W.out' | xargs -I {} cp '{}' /location/SA_DEA_W 
find . -type f -name '3SA_DEA_W.out' | xargs -I {} cp '{}' /location/SA_DEA_W 
find . -type f -name '4SA_DEA_*W.out' | xargs -I {} cp '{}' /location/SA_DEA_W

有超過 1700 個帶有各種標識縮寫的文件,例如 SA BA A HNO3 W MA EAM TMA DMA DEA 等...我需要能夠提取這些文件並將它們傳輸到一個簡單的資料庫結構中。 「位置」將是主父目錄的名稱,而 SA_DEA_W 等資料夾是父目錄內的子目錄。

答案1

mv *SA_BA_W.out  /location/SA_BA_W;

mv *SA_DEA_W.out /location/SA_DEA_W

等等。

答案2

您可以使用以下命令一次建立目錄:

建立子目錄

ls *.out | sed -Ee 's/[0-9]*([A-Za-z]+)_([0-9]*[A-Za-z]+[0-9]*)_W.out$/\1_\2_W/g' | awk ' { system("mkdir -p /location/" $0) }'

或者

find . -regextype awk -regex './([0-9]*[A-Za-z])+_([0-9]*[A-Za-z]+[0-9]*)_W.out' | sed -Ee 's/[0-9]*([A-Za-z]+)_([0-9]*[A-Za-z]+[0-9]*)_W.out$/\1_\2_W/g' | awk '{ system("mkdir -p /location/" $0) }'

或者

find . -regextype awk -regex './([0-9]*[A-Za-z])+_([0-9]*[A-Za-z]+[0-9]*)_W.out' | sed -Ee 's/[0-9]*([A-Za-z]+)_([0-9]*[A-Za-z]+[0-9]*)_W.out$/\1_\2_W/g' | xargs -I {} mkdir -p /location/{}

您可以使用下面的 for 迴圈執行這兩種操作

建立子目錄並將檔案移至對應的目錄:

for i in $(ls *.out)
do
DIR_NAME=$(echo $i | sed -Ee 's/[0-9]*([A-Za-z]+)_([0-9]*[A-Za-z]+[0-9]*)_W.out$/\1_\2_W/g')
test -d /location/$DIR_NAME || mkdir /location/$DIR_NAME
mv $i $DIR_NAME
done

答案3

你可以嘗試

find . -iname "*.out" -exec sh -c '
     f=${1##*/};
     f=${f%.out};
     d=./location/$f/;
     [ ! -d $f ] && mkdir -p $d;
     mv $1 $d'  sh {} \;

前提是您的檔案路徑中沒有空格

演練

尋找您的所有.out文件,並針對每個文件-exec .... \;

find . -iname "*.out" -exec sh -c '...script...` sh {} \; 

構造

sh -c `...script......` sh {}

將每個檔案名稱作為{}並將其傳遞回腳本中,就像$1我們在其中一樣

刪除最後的目錄路徑/並儲存為f

         f=${1##*/};

去掉.out後綴

         f=${f%.out};

計算你想要的目錄並將其儲存為d

         d=./location/$f/;

如果該目錄不存在,則建立該目錄以及任何父目錄-p

         [ ! -d $d ] && mkdir -p $d;

行動起來

         mv $1 $d'  sh {} \;

相關內容