web-dev-qa-db-ja.com

名前の一部を変更せずに、ディレクトリ内のファイルの名前を変更するにはどうすればよいですか?

私はそのように名付けられた複数のファイル(約1000)を持っています:

abcdefg123456.xyz
abcdefg123457.xyz
abcdefg123458.xyz
abcdefg123459.xyz

一部のファイルには、名前の後に4つの追加の乱数と文字(任意の順序)があります。これらは重複している可能性がありますが、常にではないため、元の形式に変更して、重複しているかどうかを確認する必要があります。彼らはこのフォーマットを持っています:

abcdefg123456a789.xyz
abcdefg123457b987.xyz
abcdefg123458c879.xyz
abcdefg123459d897.xyz

場合によっては、間違った拡張子もありますが、

abcdefg123456.xyzedf
abcdefg123456.xyzfed

これらのファイルの名前をabcdefgの元の形式に変更し、その後に元の6つの数字を続けます。つまり、末尾の4つの乱数と文字を削除し、末尾の拡張子を.xyzに戻します。これまでのところ、次のようになっています。

rename -n "s/[a-z][0-9]{6}.xyz/.xyz/g"  *

しかし、それはうまくいかないようです。何らかの理由で、出力は次のようになります。

abcdef.xyz (no numbers)

編集:どちらも解決策を見つけるのに役立ったので、私はどちらの答えから選択するかの間で少し引き裂かれました。彼が質問の2番目の部分も手伝ってくれたので、私はスタッツに行きました。しかし、あなたの助けもマーク・ペリーマンに大いに感謝しています-そしてもちろんコメンターも。

2
user681866

解決

すべてのファイルのピリオドの前にある4つの数字/文字を削除するには、次のループを使用できます。

for file in *.xyz ; do
    NEWFILE=$(echo "$file" |sed -re 's/[a-z|0-9][a-z|0-9][a-z|0-9][a-z|0-9](\.)/\./g')
    mv -v $file $NEWFILE
done

説明

for file in *.xyz ; do

拡張子が.xyzのすべてのファイルをループします

NEWFILE=$(echo "$file" |sed -re 's/[a-z|0-9][a-z|0-9][a-z|0-9][a-z|0-9](\.)/\./g')

[a-z|0-9][a-z|0-9][a-z|0-9][a-z|0-9](4つの数字または文字の組み合わせ)に一致するパターンを削除した後、ファイルの名前を含むNEWFILEという変数を作成し、その後にピリオド((\.) )。

mv -v $file $NEWFILE

ファイルを新しい名前に移動します。-vは移動プロセスを次の形式で出力します

`abcdefg123456a789.xyz` -> `abcdefg123456.xyz`

これは現在、拡張機能の修正をカバーしていませんが、上記と同様の解決策を使用できますが、sedコマンドはsed 's/\.xyz.*/\.xyz/g'です。

2
stuts

試してみてください

_rename -n -f 's/([a-z]*[0-9]{6})[a-z0-9]{0,4}(\.xyz).*/$1$2/g'  *
_

これは、debianとubuntuでリリースされたバージョンのrenameで機能します( http://www.computerhope.com/unix/rename.htm のmanページを参照)

これにより、名前が重複するファイルが上書きされます。

これが機能する理由

  • _([a-z]*[0-9]{6})_はキャプチャされたabcdefg123456であり、置換では_$1_と呼ぶことができます。
  • _(\.xyz)_はキャプチャされた拡張子であり、置換では_$2_と呼ばれます。
  • 他のすべての_[a-z0-9]{0,4}_(最大4文字/数字)と_.*_(拡張子の後のすべて)が一致し、置換では無視されます。

ボーナスパターンにまだ適合しないすべてのファイルを削除するには(たとえば、上記の強制オプションを使用しなかった場合)、findを使用してそれらをリストします。それらを削除します。 (ドライランの場合は_-exec rm {}_なしで実行します。)

_find . -regextype posix-egrep -regex '.*/[a-z]*[0-9]{6}[a-z0-9]{4}\.xyz.*|[a-z]*[0-9]{6}\.xyz.*' -exec rm {}
_
1
Mark Perryman