30

私はLinuxが初めてです。拡張子に基づいてファイルを特定のフォルダーに移動するシェルスクリプトを作成しようとしています。たとえば、ダウンロードフォルダーには、ファイルの種類が混在するすべてのファイルがあります。私は次のスクリプトを書きました

mv *.mp3 ../Music
mv *.ogg ../Music
mv *.wav ../Music
mv *.mp4 ../Videos
mv *.flv ../Videos

このフォルダにファイルが追加されたときに自動的に実行するにはどうすればよいですか? 毎回手動でスクリプトを実行する必要があります。

もう 1 つの質問ですが、これら 2 つのステートメントを組み合わせる方法はありますか

mv *.mp3 ../../Music
mv *.ogg ../../Music

単一のステートメントに?(C プログラミングの 'or' 演算子) とコンマを使用し||てみましたが、うまくいかないようです。

4

6 に答える 6

49

ファイルがディレクトリに追加されたときのトリガーはありません。ファイルが Web ページ経由でアップロードされている場合は、Web ページでそれを行うことができる場合があります。

UNIXマシン(またはWindowsのタスクスケジュール)では、これを行うスクリプトをcrontabに入れることができます。ハウツーについては、Google crontab を参照してください。

コマンドを組み合わせるには、次を使用します。

mv *.mp3 *.ogg ../../Music

さまざまな「グロブ」 (ワイルドカードを含むファイル名) を好きなだけ含めることができます。最後に、ターゲット ディレクトリを指定する必要があります。

于 2013-06-27T03:30:03.810 に答える
14

ふたつのやり方:

  1. find . -name '*mp3' -or -name '*ogg' -print | xargs -J% mv % ../../Music
  2. find . -name '*mp3' -or -name '*ogg' -exec mv {} ../Music \;

1 つ目はパイプを使用するため、引数のスペースが不足する可能性があります。一方、2 番目はフォークが多すぎて遅くなる可能性があります。しかし、どちらも機能します。

于 2013-06-27T03:31:22.300 に答える
3

incronはファイルシステムを監視し、特定のイベントで実行コマンドを実行します。

コマンド区切り文字を使用して、複数のコマンドを 1 行にまとめることができます。無条件のシリアル化されたコマンド セパレータは;.

command1 ; command2
于 2013-06-27T03:30:09.673 に答える
2

別の方法は次のとおりです。

mv -v {*.mp3,*.ogg,*.wav} ../Music
mv -v {*.mp4,*.flv} ../Videos

PS: オプション -v は、何が起こっているかを示します (冗長)。

于 2017-11-01T23:34:37.030 に答える