2

サーバーから約 600 個のファイルをダウンロードしたところ、ファイル名から最後の 11 文字 (拡張子を除く) を削除する必要があります。私はUbuntuを使用しており、これを達成するためのコマンドを探しています。

以下にいくつかの例を示します。

aarondyne_kh2_13thstruggle_or_1250556383.musに名前を変更する必要がありますaarondyne_kh2_13thstruggle_or.mus

aarondyne_kh2_darknessofunknow_1250556659.mp3に名前を変更する必要がありますaarondyne_kh2_darknessofunknow.mp3

これを行った後にいくつかの重複が存在する可能性があるようですが、コマンドが完了せず、重複が何であるかを教えてくれる場合は、いつでも手動で削除できます.

4

5 に答える 5

4

コマンドを使用してみてくださいrename。正規表現に基づいてファイルの名前を変更できます。

次の行がうまくいくはずです。

rename 's/_\d+(\.[a-z0-9A-Z]+)$/$1/' *

次の変更が発生します。

aarondyne_kh2_13thstruggle_or_1250556383.mus renamed as aarondyne_kh2_13thstruggle_or.mus
aarondyne_kh2_darknessofunknow_1250556659.mp3 renamed as aarondyne_kh2_darknessofunknow.mp3

次のようにフラグrenameを指定することで、アクションが実行されることを確認できます。-n

rename -n 's/_\d+(\.[a-z0-9A-Z]+)$/$1/' *

使用方法の詳細については、次の方法renameでマンページを開いてください。man rename

于 2013-02-15T16:36:08.820 に答える
1
find . -type f -exec sh -c 'mv {} `echo -n {} | sed  -E -e "s/[^/]{10}(\\.[^\\.]+)?$/\\1/"`' ";"
于 2013-02-15T16:40:03.233 に答える
1

最もきれいではありませんが、非常に単純です。

echo "$filename" | sed -e 's!\(.*\)...........\(\.[^.]*\)!\1\2!'

残りのスクリプトを記述する必要がありますが、それは非常に簡単です。

于 2013-02-15T16:35:45.357 に答える
0

このスクリプトは、各ファイルの拡張子が 1 つだけであることを前提としています。たとえば、「foo.something.mus」の名前を「foo.mus」に変更します。すべての拡張子を保持するには、ループ本体の最初の行から 1 つのハッシュ マーク (#) を削除します。また、各ファイル名のベースが少なくとも 12 文字であることを前提としているため、11 を削除しても名前が空になることはありません。

for f in *; do
    ext=${f##*.}
    new_f=${base%???????????.$ext}
    if [ -f "$new_f" ]; then
        echo "Will not rename $f, $new_f already exists" >&2
    else
        mv "$f" "$new_f"
    fi
done
于 2013-02-15T16:41:07.680 に答える
0

片道:

ファイルのリストを1行に1つずつ取得します(lsおそらく)。

ls....|awk  '{o=$0;sub(/_[^_.]*\./,".",$0);print "mv "o" "$0}'

これにより、mv a bコマンドが出力されます

例えば

kent$  echo "aarondyne_kh2_13thstruggle_or_1250556383.mus"|awk  '{o=$0;sub(/_[^_.]*\./,".",$0);print "mv "o" "$0}'
mv aarondyne_kh2_13thstruggle_or_1250556383.mus aarondyne_kh2_13thstruggle_or.mus

実行するには、パイプするだけです|sh

ファイル名にスペースがないと思います。

于 2013-02-15T16:39:11.630 に答える