
次の名前の複数のディレクトリを作成できるbash関数スクリプトを作成しようとしています。また、ファイルを拡張子ごとに適切なフォルダに整理しようとしました(例:.jpgは写真、.docは文書、.gifはメディアなど)。最初の部分は良いですが、ディレクトリが作成された後、2番目の部分は私を混乱させます。
#!/bin/bash
echo "Creating directory categories"
function make_folder
{
cd -; cd content; sudo mkdir ./$1
}
make_folder "documents"
make_folder "other"
make_folder "pictures"
make_folder "media"
echo "Directories have been made"; cd -
exit
ext="${filename##*.}" #set var ext to extension of files
find ./random -name | #find and list all files in random folder
#pipe results of find into if statement
if ext == ["jpg"; "jpeg"; "png"] #move ".jpg", etc to new destination
then
mv /path/to/source /path/to/destination
elif ext == [".gif"; ".mov"] #move ".gif", etc to new destination
then
mv /path/to/source /path/to/destination
else #move other files into to new destination
mv /path/to/source /path/to/destination
fi
答え1
私の頭の上で、私は「ケース」ドアを使用します。
つまり
case "$FILE" in
*.jpg|*.jpeg)
mv "$FILE" to where you want it
;;
*.gif|*.mov)
mv "$FILE" to where you want it
;;
*)
echo "Unmanaged file type: $FILE, skipping"
;;
esac
...しかし、ループコンテナで梱包する必要があり、確かにfindを使用したい場合は適しています。
find <your stuff> |
while read FILE
do
...case statement goes here
done
ちょうど私の$ 0.02
乾杯! /ダニエル
答え2
あなたのmake_folder
機能は不必要に複雑です。これらの現在のディレクトリの変更はあなたの人生をより複雑にするだけです。まず第一に、次の作業は必要ありませんsudo
。ルートとしてディレクトリを作成するのはなぜですか?ただ電話してくださいmkdir
。
mkdir documents other pictures media
ディレクトリがすでに存在していてもスクリプトが機能するようにするには、次のようにしますmkdir -p
。
mkdir -p documents other pictures media
を使用するには、find
名前を印刷して解析しないでください。find
必要なコードを実行してみてください-exec
。単純なプログラムを呼び出すだけでなく、シェルを呼び出すこともできます。の場合、<code>sh -c '<em>shell code</em>'
シェルコードに続くパラメータはsh
シェルコードで使用できます$0
。変数の置換には常に二重引用符を使用してください。。シェルの断片から拡張によって区別する自然な方法は、次のものを使用することです。ケースファイル名に基づいて構成されます。私は使うパラメータ拡張${0##*/}
ファイルのデフォルト名を取得するように構成されています(最後のスラッシュの前のすべてのエントリを削除します)。このテストは、[ -e "$destination_file" ]
別のディレクトリから移動された同じ名前のファイルを上書きしないように、ターゲットファイルがすでに存在するかどうかをテストします。
find random -exec sh -c '
case "$0" in
*.gif|*.png|*.jpg) destination_directory=pictures;;
…
*) destination_directory=other;;
esac
destination_file="$destination_directory/${0##*/}"
if [ -e "$destination_file" ]; then mv "$0" "$destination_file"; fi
' {} \;
もう1つの方法はターゲットごとにファイルをコピーすることですが、ファイル数が多いと速度が遅くなる可能性がありますが、作成する方がはるかに簡単です。 Linuxでは、GNUユーティリティのおかげで、次のように簡単です。
find random \( -name '*.gif' -o -name '*.png' -o -name '*.jpg' \) -exec mv -n -t pictures {} +
他の宛先ディレクトリにも同様です。作業速度を上げるには、最後に一括呼び出しの+
代わりに使用してください。;
find -exec
mv
しかし、実際にbashやzshで実行されているタスクにはfind
。**
ワイルドカード再帰的なディレクトリの検索に使用されます。
shopt -s globstar # necessary in bash to enable **
mv -n random/**/*.gif random/**/*.png random/**/*.jpg pictures/
すべてのファイルをターゲットディレクトリに直接配置するとします。ディレクトリ階層を再現したい場合は、話が異なり、他のツールが適しています。