私はそのように名付けられた複数のファイル(約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番目の部分も手伝ってくれたので、私はスタッツに行きました。しかし、あなたの助けもマーク・ペリーマンに大いに感謝しています-そしてもちろんコメンターも。
すべてのファイルのピリオドの前にある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'
です。
試してみてください
_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 {}
_