
ターミナルでファイルを移動するのは簡単です。毎日、学生から大量のファイルが提出されるので、夕方に実行できる 1 つのプログラムで、提出された写真 (通常は JPG と PNG) をすべて 1 つのディレクトリに移動し、テキスト ファイルをすべて別のディレクトリに移動できれば、作業がずっと楽になります。
コマンドの一種を使用して基本的なものを記述することもできますmv *.jpg
が、そのような種類のファイルが存在しない場合は、スクリプト全体が失敗し、時間節約の作業全体が無意味になると思われます。
さらに複雑なことに、私の高校の生徒の何人かは zip 形式で提出するので、スクリプトでまず zip 形式を抽出できるようにしたいのです。
つまり、TL;DR - 特定の種類のファイルが存在しないために発生するエラーで停止することなく、zip を抽出してファイルを移動します。
答え1
スクリプト全体が失敗すると想定しています
そうはなりません。その単一のコマンドだけが「失敗」します (つまり、*.jpg
グロブ パターンがリテラル に展開され*.jpg
、指定されたファイルが存在しない場合にコマンドがエラーをスローします*.jpg
)。ただし、スクリプトはエラーにもかかわらず実行を続けます。したがって、ほとんどの場合、それは問題になりませんが、正しい方法で作業を行いたい場合は、failglob
グロブ パターンを含むコマンドを実行する前に を有効にしてください。
shopt -s failglob
シェル オプションが設定されていて、一致するものが見つからない場合は
failglob
、エラー メッセージが出力され、コマンドは実行されません。
現在の作業ディレクトリ内のすべての .zip ファイルを 1 つのディレクトリに抽出するには:
unzip '*.zip' -d /path/to/target/directory
*.zip
は一重引用符で囲まれているため、パターンを独自に展開できることに注意してくださいunzip
(そうでない場合、コマンドは失敗します)。
すべてをまとめると:
#/bin/bash
shopt -s failglob
mv *.jpg /path/to/target/directory
mv *.png /path/to/target/directory
unzip '*.zip' -d /path/to/target/directory
答え2
構造を使用するコマンドが 3 つあれば十分ですfind SOURCE_FOLDER -type f -exec COMMAND {} \;
。以下は、3 つすべてを組み合わせたスクリプトです。ファイルが見つからない場合、各コマンドは何も表示されずに終了します。これは非常に単純なことです。つまり、png ファイルがあっても jpeg ファイルがなくても、エラーなく png を必要な場所に移動できます。
ここに小さなデモがあります。2つの画像ファイルと1つのzipファイルがあることがわかります。スクリプトはアーカイブを解凍し、すべてのpngとjpegを収集して適切なディレクトリに投げ込みます。
$> ls
JPEGS/ Pictures.zip PNGS/ rMzMHd7.jpg waves.png*
$> pwd
/home/xieerqi/TESTDIR
$> bash /home/xieerqi/cleanup_directory.sh
Archive: /home/xieerqi/TESTDIR/Pictures.zip
inflating: /home/xieerqi/TESTDIR/ASDF.png
inflating: /home/xieerqi/TESTDIR/IMG20160117233913~01.jpg
inflating: /home/xieerqi/TESTDIR/resized_Screenshot from 2016-01-10 08:52:10.png
$> ls
JPEGS/ Pictures.zip PNGS/
$> ls JPEGS
IMG20160117233913~01.jpg rMzMHd7.jpg
$> ls PNGS/
ASDF.png resized_Screenshot from 2016-01-10 08:52:10.png waves.png*
$>
スクリプト自体は次のようになります。
# Set here the working directory and the destinations
DIR="/home/xieerqi/TESTDIR"
PNG_DIR="/home/xieerqi/TESTDIR/PNGS"
JPEGS_DIR="/home/xieerqi/TESTDIR/JPEGS"
# Find all zip files in dir and extract them
# If not found, the script just continues on
find $DIR -maxdepth 1 -type f -iname "*.zip" -exec unzip {} -d $DIR \;
# Find all png files in the dir and move them to PNG_DIR
# use cp instead of mv if you are worried about loosing files
find $DIR -maxdepth 1 -type f -iname "*.png" -exec mv -t $PNG_DIR {} \+
# Find all JPEG/JPG files and throw them into JPENGS_DIR
# use cp if you are worried about loosing files
find $DIR -maxdepth 1 -type f \( -iname "*.jpg" -o -iname "*.jpeg" \) -exec mv -t $JPEGS_DIR {} \+