ファイル名から一部の文字を繰り返し削除

ファイル名から一部の文字を繰り返し削除

私のフォルダとサブフォルダにはたくさんのファイルがあります。

すべてのファイル名から一部の文字(同じ場所)を削除する必要があります。

例:

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噴射

おすすめ記事