シェル:名前のパターンに基づいたファイル管理

シェル:名前のパターンに基づいたファイル管理

私は同じディレクトリにある12個の塗りつぶしセットを作業しています。入力された名前は、_で区切られた複数列形式で提供されます。以下は12個のフィラーです。

7000_01_lig_cne_767.dlg 7000_05_lig_cne_767.dlg 7000_09_lig_cne_767.dlg
7000_02_lig_cne_767.dlg 7000_06_lig_cne_767.dlg 7000_10_lig_cne_767.dlg
7000_03_lig_cne_767.dlg 7000_07_lig_cne_767.dlg 7000_11_lig_cne_767.dlg
7000_04_lig_cne_767.dlg 7000_08_lig_cne_767.dlg 7000_12_lig_cne_767.dlg

ここで、パディングの違いは2番目の列(1から12まで)に表示され、すべての名前は同じままです。

これらのファイルを繰り返し、各ファイルのディレクトリを作成し(2番目の列に2つのファイルを区別するパターンとして機能する番号を含む)、特定のファイル(たとえば7000_04_lig_cne_767)をコピーするのに適した単純なbashワークフローを作成する必要がありますします。 dlg)このディレクトリ(box_04)を入力します。したがって、作成された各サブフォルダには1つのファイルのみを含める必要があります。これは私のテンプレートです。

#!/bin/bash
#set the name of folder with all DLG
FILES=$PWD/ALL_DLG

#name of the subfolder in which several subfolders (containing one of the input file) whould be created
output=${home}/sub_folders_to_analyse


# manage DLG filles
for i in ${FILES}/*.dlg       
do 
    # write some expression to take the file according to the number indicated within its second column
    # n = is the number occured in the second column;
    # manage the files to proper directories
    mkdir -p ${output}/"box_$n"
    cp "$i" ${output}/"box_$n"
done

forループで定義されているnには、2番目の列の番号(各ファイル名)を参照するいくつかのSEDベースの式を含める必要があると思います。

答え1

ファイル名の構造は非常に規則的であるため、このフィールドを抽出するために使用できますcutしかし、@steeldriverが指摘したように、ファイルパスには$PWD/ALL_DLGすでに1が含まれているため、明示的に説明するか、_このbasenameコマンドを使用して、ジョブがパスコンポーネントではなく実際のファイル名にのみ適用されることを確認する必要があります。

n=$(basename "$f" | cut -d'_' -f 2)

cutファイル名にコマンド(フィールド区切り文字として使用されます)を適用し、_2番目のフィールド(つまり、識別したい数字)を抽出します。その後、nコマンド置換によって結果がシェル変数に書き込まれます。

関連情報