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
。