私のフォルダとサブフォルダにはたくさんのファイルがあります。
すべてのファイル名から一部の文字(同じ場所)を削除する必要があります。
例:
IMG-20230226-WA0002.jpg -> 20230226-WA0002.jpg
を使うのが最も簡単な方法だと思ってそうしましecho ${i:N:N}
た。
for i in $(find . -type f); do mv "$i" "${i:5}; done
フルパスを含むファイルを表示していると思いましたが、どうすれば正しく実行できますか?
PS:「文字列」に対してどのようにこれを行うことができますか?たとえば、IMG-
ファイルから文字列を削除しますか?
PS2:コマンドを使用したくありませんrename
。
ありがとうございます。
答え1
このように:
find . -type f -regextype egrep \
-regex '.*/[[:alnum:]-]{7,}.*\.jpg$' -execdir bash -c '
for file; do echo mv "$file" "${file:7}"; done
' bash {} +
2: 5+2 = 7
ファイルが.で終わるので追加しました./
。
文字列の場合:
find . -type f -name '*.jpg' -execdir bash -c '
for file; do echo mv "$file" "${file#./IMG-}"; done
' bash {} +
またはglobstar
再帰を使用してください。
shopt -s globstar
for file in **/*.jpg; do
( cd "$(dirname "$file")" && echo mv "$file" "${file#IMG-}" )
done
echo
出力に満足したら、文を削除してください。
心が変わったら真珠rename
:
rename -n -d 's/.*/substr($&, 5)/e' ./**/*.jpg
rename -n -d 's/^IMG-//' ./**/*.jpg
キル-n
スイッチ、別名。試運転あなたの試みが満足なとき実際の名前に変更。
この-d
スイッチはファイル名のみを変更し、ファイルパスは削除します。
find
現在のファイルのディレクトリ内の一致する各エントリに対して-execdir
操作を実行します。cd
シェルを防ぐためにループにfor
ループを使用しないでください。find
噴射。
答え2
このツールを確認してくださいmmv
。これはすべての最新のディストリビューションに存在し、必要な操作を正確に実行する必要があります。
ここの例は次のとおりです。
mmv 'IMG-*.jpg' '#1.jpg'
最初の 4 文字を削除するには:
mmv '????*.jpg' '#5.jpg'