メインディレクトリの異なるディレクトリにファイルを整理する

メインディレクトリの異なるディレクトリにファイルを整理する

メイン ディレクトリから、内部に複数のサブディレクトリがある個別のディレクトリに移動しようとしているファイルが多数あります。

ファイルの命名規則の例: 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

SA BA A HNO3 W MA EAM TMA DMA DEA など、さまざまな識別略語を持つ 1700 を超えるファイルがあります。これらのファイルを取得して、簡単なデータベース構造に転送できるようにする必要があります。「場所」はメインの親ディレクトリの名前になり、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 {} \;

関連情報