web-dev-qa-db-ja.com

ファイル名の一部をbashで削除する

私は次の形式の次のファイルを持っています:

$ ls CombinedReports_LLL-*'('*.csv
CombinedReports_LLL-20140211144020(Untitled_1).csv
CombinedReports_LLL-20140211144020(Untitled_11).csv
CombinedReports_LLL-20140211144020(Untitled_110).csv
CombinedReports_LLL-20140211144020(Untitled_111).csv
CombinedReports_LLL-20140211144020(Untitled_12).csv
CombinedReports_LLL-20140211144020(Untitled_13).csv
CombinedReports_LLL-20140211144020(Untitled_14).csv
CombinedReports_LLL-20140211144020(Untitled_15).csv
CombinedReports_LLL-20140211144020(Untitled_16).csv
CombinedReports_LLL-20140211144020(Untitled_17).csv
CombinedReports_LLL-20140211144020(Untitled_18).csv
CombinedReports_LLL-20140211144020(Untitled_19).csv

この部分を削除したい:
20140211144020(これはレポートが実行されたタイムスタンプであるため、これは異なります)

そして、次のようなものになります:

CombinedReports_LLL-(Untitled_1).csv
CombinedReports_LLL-(Untitled_11).csv
CombinedReports_LLL-(Untitled_110).csv
CombinedReports_LLL-(Untitled_111).csv
CombinedReports_LLL-(Untitled_12).csv
CombinedReports_LLL-(Untitled_13).csv
CombinedReports_LLL-(Untitled_14).csv
CombinedReports_LLL-(Untitled_15).csv
CombinedReports_LLL-(Untitled_16).csv
CombinedReports_LLL-(Untitled_17).csv
CombinedReports_LLL-(Untitled_18).csv
CombinedReports_LLL-(Untitled_19).csv

mv コマンドの行に沿って単純に考えていました。おそらく次のようなものです。

$ ls CombinedReports_LLL-*'('*.csv

しかし多分 sed コマンドか他の方が良いでしょう

9
HattrickNZ

renamePerlパッケージの一部です。 Perlスタイルの正規表現に従ってファイルの名前を変更します。ファイル名から日付を削除するには:

_rename 's/[0-9]{14}//' CombinedReports_LLL-*.csv
_

renameが利用できない場合は、sed + Shellを使用できます。

_for fname in Combined*.csv ; do mv "$fname" "$(echo "$fname" | sed -r 's/[0-9]{14}//')" ; done
_

上記は、各ファイルをループします。ファイルごとに、mvコマンドを実行します。mv "$fname" "$(echo "$fname" | sed -r 's/[0-9]{14}//')"ここで、この場合、sedrenameと同じ正規表現を使用できます。上記のコマンド。 _s/[0-9]{14}//_は、sedに連続して14桁を検索し、それらを空の文字列に置き換えるように指示します。

14
John1024

renamesedのような他のツールを使用せず、bashだけに厳密に固執する:

for f in CombinedReports_LLL-*.csv
do
  newName=${f/LLL-*\(/LLL-(}
  mv -i "$f" "$newName"
done
7
Alfe
for f in CombinedReports_LLL-* ; do
    b=${f:0:20}${f:34:500}
    mv "$f" "$b"
done

Shellで1行ずつ試すことができます。

f="CombinedReports_LLL-20140211144020(Untitled_11).csv"
b=${f:0:20}${f:34:500}
echo $b
1
Pedro Nunes

私は一番上の応答で与えられたアドバイスを使用していて、次の行をシェルスクリプトに入れました:

ls *.nii | xargs rename 's/[f_]{2}//' f_0*.nii

ターミナルでは、この行は完全に機能しますが、私のスクリプトでは実行されず、ファイル名のリテラル部分として*を読み取ります。

0
user5318429

これにはrenameユーティリティを使用できます。ファイル名を変更するためにsedのような構文を使用します。次の例(名前変更のマニュアルページから)は、ローカルディレクトリ内のバックアップファイルのリストから末尾の「.bak」拡張子を削除する方法を示しています。

rename 's/\.bak$//' *.bak
0
Kevin