ファイル内の特定の規則に従ってサブフォルダ内のファイルを移動します。

ファイル内の特定の規則に従ってサブフォルダ内のファイルを移動します。

多くの.txtファイルを含む大きなフォルダが1つあります。

rules.csvこの.txtファイルをファイル内の特定の規則(該当するサブフォルダー)に基づいて別々のサブフォルダーにグループ化しようとしています。

大容量フォルダ:
file1.txt
file2.txt
...
file100.txt

ルールは次のとおりです。

ファイル1.txt
ファイル3.txt
ファイル8.txt

「サブフォルダ1」に属する

ファイル2.txt
ファイル4.txt
ファイル23.txt

「サブフォルダ2」に属する

など

以下はCSV形式(rules.csv)のルールのリストです。

最初の列はファイル名、2番目の列はファイルを移動したいサブフォルダです。

file1.txt   subfolder1
file3.txt   subfolder1
file8.txt   subfolder1
    
file2.txt   subfolder2
file4.txt   subfolder2
file23.txt  subfolder2

file5.txt   subfolder3
file6.txt   subfolder3
file9.txt   subfolder3
file11.txt  subfolder3
file16.txt  subfolder3

file12.txt  subfolder4
file13.txt  subfolder4
file14.txt  subfolder4
file19.txt  subfolder4
file24.txt  subfolder4
file28.txt  subfolder4
file30.txt  subfolder4

file78.txt  subfolder5
file37.txt  subfolder5
file49.txt  subfolder5
file88.txt  subfolder5

これが私が達成したいものです。

「mv」などの端末コマンドに基づいて、これらの.txtファイルをそのサブフォルダに移動し、上記のCSVファイルからこれらの規則を読み取る方法はありますか? (可能かどうかわからない)

私はこれを試しました

mv file1.txt,file3.txt,file8.txt* /subfolder1

しかし、ルールなしですべての人のために手動で行うことは非生産的なようです:(

答え1

質問が示すように、ファイル名にスペースはありませんがスペースはないと仮定すると、単純なシェルループを使用してファイルを2番目の列の対応するディレクトリに移動できます。

while IFS=' ' read -r fileName dirName; do
    mkdir -p "./$dirName" && mv "./$fileName" "./$dirName";
done <rules.txt

もしあなたのrules.csv実際には、.csvファイル(カンマ区切りファイル)の場合はIFS=,上記の内容を変更できます(ファイル名またはディレクトリ名にはカンマ文字を含めないでください)。

関連情報