フォルダには、次のような数千のファイルがあります。
cat eats mouse.jpg
cat chases mouse.jpg
gorilla eats banana.jpg
gorilla is sleeping.jpg
elephant is huge.jpg
elephant has trunk.jpg
(and so on...)
私は、ファイル名の最初のWordに基づいてこれらのファイル(猫、ゴリラ、象など)を、最初のWordに基づいて作成されたフォルダーに移動するbashスクリプトが必要です。
次のワンライナーは仕事をするべきです:
_find . -maxdepth 1 -type f -name '*.jpg' -exec Perl -e '$a="{}"; $a =~ /(\w+)/; `mkdir -p $1 && mv "$a" $1`' \;
_
説明
_find . -maxdepth 1 -type f -name '*.jpg'
_は、現在のフォルダー(_-type f
_)で拡張子jpgのファイル(_. -maxdepth 1
_)のみを検索します。
_-exec
_は、一致するすべてのファイルに対してPerl
コマンドを呼び出します。文字列_{}
_は、処理中の現在のファイル名に置き換えられます。
_$a="{}";
_は現在のファイルを保存します
$a =~ /(\w+)/
は正規表現テストです。特殊変数_$1
_には、_$a
_に保存されているファイル名の最初のワードが含まれます。
最後に、_mkdir -p $1 && mv "$a" $1
_は、_/bin/sh
_またはそれと同等のシステムコマンドとして実行されます。 mkdir
の_-p
_オプションに注意してください。ディレクトリがすでに存在する場合でも失敗しません。
更新
Perlでのコードインジェクションを防ぐには(@ geirha に感謝)、次のように quotemeta 関数を使用します。
_find . -maxdepth 1 -type f -name '*.jpg' -exec Perl -e '$a="\Q@ARGV"; $a =~ /(\w+)/; `mkdir -p $1 && mv $a $1`' "{}" \;
_
これにはforループを使用します。
for file in ./*" "*.jpg; do
Word=${file%% *}
mkdir -p "$Word" &&
mv "$file" "$Word"
done
これを対話型シェルで実行するか、スクリプトに追加できます。 Bashは知っておくと非常に役立つので、時間があるときに Bash Guide を読んで学習することをお勧めします。