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

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

私は何百ものディレクトリを持っています、いくつかは別のディレクトリに入れ子になっており、そこには何万ものファイルがあります。これらのファイルには日付/時刻スタンプを削除する必要があります。

サンプルファイル名はですLetter to Client 27May2016~20160531-162719.pdf。元の状態に戻したいです。Letter to Client 27May2016.pdf

別の例のファイル名はですABCDEF~20160531-162719。に戻したいですABCDEF。上記の例とは異なり、このファイルには拡張子はありません。

影響を受けるフォルダのルートで実行してファイル名を再帰的に見つけて変更するコマンドが必要です。

(私はSyncthingを使用してファイルを同期し、削除されたファイルをディレクトリ.stversionsから元の場所にコピーして復元しましたが、Syncthingに対応する日付/時刻スタンプが追加されたことがわかりました...)

ベストアンサー1

Perlrenameツールについて学びます。

$ rename -n -v  's/~[^.]+//' *~*
rename(ABCDEF~20160531-162719, ABCDEF)
rename(Letter to Client 27May2016~20160531-162719.pdf, Letter to Client 27May2016.pdf)

オンラインマニュアルページ、返品この質問を見ました。)

この正規表現は、チルダ(つまり、ドットではなく1つ以上の文字)と一致し、空の文字列と一致するすべての文字を置き換えると言います。-n実際に交換するには削除してください。~[-0-9]+数字とダッシュのみを変更するようにパターンを変更できます。

申し訳ありません。 「再帰的に」と言われたので、次のようにしましょうfind

$ find -type f -name "*~*" -execdir  rename -n -v  's/~[-0-9]+//' {} +
rename(./ABCDEF~20160531-162719, ./ABCDEF)
rename(./Letter to Client 27May2016~20160531-162719.pdf, ./Letter to Client 27May2016.pdf)

または、単にBashまたはkshを使用してください。しかし、数字の後に続くディレクトリは~それを破ります。

$ shopt -s extglob       # not needed in ksh (as far as I can tell)
$ shopt -s globstar      # 'set -o globstar' in ksh
$ for f in **/*~* ; do 
    g=${f//~+([-0-9])/}; 
    echo mv -- "$f" "$g" 
  done
mv -- ABCDEF~20160531-162719 ABCDEF
mv -- Letter to Client 27May2016~20160531-162719.pdf Letter to Client 27May2016.pdf

実際に名前を変更するには、もう一度削除してくださいecho

おすすめ記事