
私は何百ものディレクトリを持っています、いくつかは別のディレクトリに入れ子になっており、そこには何万ものファイルがあります。これらのファイルには日付/時刻スタンプを削除する必要があります。
サンプルファイル名はです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
。
答え2
バッシュから:
shopt -s globstar
for file in **/*~[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]-[0-9][0-9][0-9][0-9][0-9][0-9]*
do
echo mv -- "$file" "${file/~[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]-[0-9][0-9][0-9][0-9][0-9][0-9]/}"
done
これは、日付パターンに一致するすべてのファイル名(後にチルダで表示)を(繰り返し)検索し、名前を変更するmv
コマンド例を返します。 mv コマンドのターゲットは、チルダ日付文字列リテラルを何も置き換えない bash 引数拡張の結果です。
答え3
パスワード:
echo "ABCDEF~20160531-162719" | sed "s/~.*//g"
echo "Letter to Client 27May2016~20160531-162719.pdf" |sed "s/~.*[^.pdf]//g"
上記のコマンドは上記の結果を取得します。