2016-04-27 4 views
3

私は単なるunix時代のファイルをたくさん持っています。問題は、ファイル名がmillisになり、ディレクトリをスキャンするプログラムが秒単位であると予想されることです。ですから、.txt拡張子の前に最後の3桁を削除するために、すべてのファイルの名前を変更する必要があります。 IE:Bash Regexはファイル名を変更します

1461758015598.txt - > 1461758015.txt

私はこれを行う方法を確認していないので、私は正規表現とはbashに新しいです。ここで

+0

Aに依存していることを再帰的に動作するfailsafe pythonの代替:http://stackoverflow.com/a/39698169/191246 – ccpizza

答えて

3

が一つの方法だ:dodone

for f in *.txt; do 
    mv "$f" "${f/[0-9][0-9][0-9].txt/.txt}" 
done 

、それは、一度に1つのファイルを見ていて、現在のファイルの名前はPARAMTER fです。 "$f"は、そのパラメータの値です。変更されません。 "${f/[0-9][0-9][0-9].txt/.txt}"は、置換が適用されたパラメータの値です。.txtを使用して「3桁の数字を.txt」に置き換えます。

@anubhavaが指摘しているように、2回以上実行すると、ファイル名の桁の長さが引き延ばされますので、そうしないでください。グロブパターンを強化することによって、それを等号にすることができます。これは少し扱いに​​くいです:

for f 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].txt; do 
    mv "$f" "${f/[0-9][0-9][0-9].txt/.txt}" 
done 

だから、あなたはそれをよりコンパクトにするために外部ツールを使用する場合があります(これはディレクトリ内のファイル名にはスペースや改行がないと仮定し):

for f in $(ls -1 | egrep '^[0-9]{13}\.txt$'); do 
    mv "$f" "${f/[0-9][0-9][0-9].txt/.txt}" 
done 

あなたはwhile readループを使用して、単に「ノー改行」に制限を減らすことができます

ls -1 | egrep '^[0-9]{13}\.txt$' | while read f; do 
    mv "$f" "${f/[0-9][0-9][0-9].txt/.txt}" 
done 
+4

OPは一度だけ実行する必要があります。また、 '1461758015.txt'の名前を' 1461758.txt'に変更し、 '1461758.txt '〜' 1461.txt' – anubhava

+0

If OPはbashを使っていますがextglobは 'ls +([0-9])。txt | egrep ... 'は、より安全なだけでなく、本当に大きなディレクトリでよりパフォーマンスがよいかもしれません。 – ghoti

0

マークの答えは、オプションの数をカバーしています。

しかし、あなたが再帰的な何かをしたい場合は、私はこのようなfindベースのソリューションで行くと思います:

find -E . -regex '.*/[0-9]{13}\.txt' -exec \ 
    sh -c 'set -; mv -v "$0" "${0%???.txt}.txt"' "{}" \; 

注:

  • 私はに-Eオプションを持っているのFreeBSDを、使用していますEREを使用するように-regexに伝えてください。古いOSを使用している場合は、EREをBREに変換する必要があります。
  • EREは13桁の数字を要求します。これにより、コンバージョンを2回以上実行した場合、減少する増加に対するanubhavaの懸念からあなたを救うことができます。
  • パラメータ拡張のために、私は${../../}の代わりに${..%..}を使用しています。このPOSIXは、bashに依存するのではなく、準拠しています。
  • なぜマッチで単に数字の代わりに1つのワイルドカード文字が取り除かれるのだろうかと疑問に思うかもしれません。これはうまくいきます - 入力するのが簡単です。オプションの一部としてファイル名の制約を既に設定しています(find)。

あなたはfindの使用を避けることを好むだろうが、まだbashで再帰的な何かをしたい、あなたはglobstarオプションを使用することができれば:

shopt -s globstar extglob 
for f in **/+([0-9]).txt; do 
    [[ $f =~ ^[0-9]{13}\.txt$ ]] && mv -v "$f" "${f%...\.txt}.txt" 
done 

globstarはbashのバージョン4

関連する問題