スクリプトでパラメータを使用する

スクリプトでパラメータを使用する

私は通常、findコマンドを使用してAディレクトリからBディレクトリに特定のマルチメディアファイルを自動的にコピーします。次のコマンドを使用します。

for f in `find ./ -name "*.mkv" -mtime -24h`; do cp $f rename/ ; done

これはまさに私が望むことをしますが、コマンドを実行可能なスクリプトに移動したので(これを呼び出すとmmcopy完璧に動作します)、次のようにスクリプトを改善できるかどうか疑問に思います。

コマンドラインに入力するときに、mmcopyスクリプト内の2つの演算子/変数、つまりファイル拡張子の変数とmtime演算子の変数を解析して、コピーする必要があるファイルの種類とコピーの頻度を指定できます。ファイルがある可能性があります。

.jpg例:3日後にディレクトリの(すべての)ファイルを自動的にコピーしたいと思います。コマンドラインは次のようになります。mmcopy jpg -3d

これを行うには、スクリプトをどのように変更する必要がありますか?

ベストアンサー1

まず、現在のスクリプトは、スペースやその他の特殊文字を含むファイル名で中断されます。この問題を解決するのはとても簡単です。変数の置換には常に二重引用符を使用し、-exec代わりに使用してくださいfindスペースやその他の特殊文字が原因でシェルスクリプトが停止するのはなぜですか?より多くの情報を知りたいです。

find . -name "*.mkv" -mtime -24h -exec cp {} rename/ \;

スクリプトに渡されたパラメータは、特殊パラメータ$1などで使用できます。$2次のスクリプトは、拡張子がスクリプトの最初の引数であり、タイムスタンプ比較が2番目の引数として提供されるファイルをコピーします。

#!/bin/sh
find . -name "*.$1" -mtime "$2" -exec cp {} rename/ \;

パラメーターが欠落しているときにデフォルト値を使用するには、以下を使用できます。${…:-…}パラメータ拡張構造

#!/bin/sh
find . -name "*.${1:-mkv}" -mtime "${2:--1d}" -exec cp {} rename/ \;

またはcpに交換することをお勧めします。ファイルにタイムスタンプを保存すると、ファイルをいつコピーしたかを簡単に確認できます。また、ファイルがコピーされた場合はコピーされません(元のファイルのタイムスタンプやサイズが異なる場合を除く)。cp -prsync -acp -prsync -a

おすすめ記事