csvリストに基づいて、一致するプレフィックスを持つすべてのファイルをフォルダに移動します。

csvリストに基づいて、一致するプレフィックスを持つすべてのファイルをフォルダに移動します。

csvリストには、さまざまなプレフィックスを含む数千のファイルがグループ化されています。今、リストに基づいてそのフォルダにすべて移動したいと思います。

例: ファイル A1B1C1_{...}.png、A1B2C2_{...}.png、A1B1C3_{...}.png など CSV リスト:

Name   Group
A1B1C1 John
A2B1C1 John
A1B2C2 Denver
A1B1C3 Nick

ここで、A1B1C1_とA2B1C1_プレフィックスが付いたすべてのファイルをJohnフォルダに、A1B2C2_プレフィックスをDenverフォルダに、A1B1C3_プレフィックスをNickフォルダに移動したいと思います。

私は考えています

for group in *_*.csv; 
 do {...}

しかし、csvファイルからリストを読み取る方法とリスト構文からファイルを移動する方法はわかりません。

私はCentOSで作業しています。本当にありがとうございます。

ベストアンサー1

awk 'NR > 1 { print $1, $2 }' list.csv |
while read -r prefix group; do
    find . -type f -name "$prefix*" -exec sh -c '
        group="$1"; shift
        mkdir -p "$group"
        for name do echo mv "$name" "$group"; done' sh "$group" {} +
done

awkこれは、whileループのプレフィックスとグループ名を提供するために使用されます(リストファイルのヘッダーをスキップ)。これは、すべてのプレフィックスとグループ名にスペースやタブがないと仮定します。

while ループ呼び出しは、find名前が指定されたプレフィックスで始まる現在のディレクトリ内または下のすべての一般ファイルを探します。これらすべてのファイルに対して、次の短いシェルスクリプトが呼び出されます。

group="$1"
shift

mkdir -p "$group"
for name do
    echo mv "$name" "$group"
done

スクリプトでは、グループ名がコマンドラインの最初の引数になり、残りの引数はグループディレクトリに移動するファイルのパス名になると予想します。

スクリプトは、現在の作業ディレクトリにグループディレクトリがない場合は、グループディレクトリを作成し、指定されたパス名を繰り返して各ファイルを所定の場所に移動します。ファイルが上書きされたことを確認しません。

実際の操作echoから保護されています。mvコードを実行して正常に動作してechoいることを確認してからecho

おすすめ記事