私はCCTVカメラの画像を保存するためにSynologyを使用しています。 CCTVシステムのファイルをSynologyにコピーし、AVI形式に変換しました。したがって、私のファイル名は次のようになります。
10.01.07-10.01.48[M][@0][0].dav.avi
次のように上記の名前から再帰的に名前を変更したいと思います。
10.01.07-10.01.48.avi
各ファイル名には常に同じ部分が含まれます。[M][@0][0].dav.avi
rename
しかし、問題はSynologyシェルにコマンドがないことです(sh
いいえbash
)。
find
私は成功せずにさまざまな構文でコマンドを試しました。解決策を見つけるのに役立ちますか?
ベストアンサー1
次のことができます。
find . -name '*\[M]\[@0]\[0].dav.avi' -type f -exec sh -c '
for file do
echo mv "$file" "${file%"[M][@0][0].dav.avi"}.avi"
done' sh {} +
(echo
元気になったら削除してください。)
.dav.avi
または、すべての名前をに変更し、if.avi
も削除したい場合:[M][@0][0]
find . -name '*.dav.avi' -type f -exec sh -c '
for file do
new=${file%.*.*}
new=${new%"[M][@0][0]"}.avi
echo mv "$file" "$new"
done' sh +
これはPOSIX構文であり、busyboxユーティリティと一緒に使用することもできるため、Synologyで動作する必要があります。
いくつかの注意事項(あなたと他の答えの観察に基づいています):
- 渡されたパターンは
find -name
引用しなければなりません。それ以外の場合は、シェルによって拡張される可能性があります。 xargs
スペース、改行、引用符、またはバックスラッシュが含まれていないことを保証できない場合は、ファイル名には使用できません。printf
代わりにecho
任意のデータを出力するために使用してください。。- リストコンテキストで引用符なしの変数拡張を維持することは非常に特別な意味を持ちます。。ここではそうしたくないでしょう。
- この
.
文字は特殊正規表現演算子なので、文字通り処理するには正規表現からエスケープする必要があります。 - 1行を読む構文
read
は次のとおりです。IFS= read -r line
しかし、ファイルパスが1行だけで構成されるという保証はありません。 (cd -P -- "$dir" && find . ... -exec)
これは通常、andで始まる述語や値find -- "$dir" ... -exec
の問題を回避し、に渡されるファイルパスを短くすることでより多くのコンテンツを渡すことができるため、この方法よりも優れています。$dir
find
-
-exec