web-dev-qa-db-ja.com

ファイル名から数字を削除する

Music/ディレクトリ内のファイル名の変更に問題があります。

私はこれらのような名前のリストを持っています:

$ ls
01 American Idiot.mp3
01 Articolo 31 - Domani Smetto.mp3
01 Bohemian rapsody.mp3
01 Eye of the Tiger.mp3
04 Halo.mp3
04 Indietro.mp3
04 You Can't Hurry Love.mp3
05 Beautiful girls.mp3
16 Apologize.mp3
16 Christmas Is All Around.mp3
Adam's song.mp3
A far l'amore comincia tu.mp3
All By My Self.MP3
Always.mp3
Angel.mp3

同様に、ファイル名の前にあるすべての数字を切り取りたいと思います(拡張子の3ではありません)。

最初にgrepfind -execまたはxargsの番号のファイルのみを試しましたが、この最初のステップでも成功しませんでした。 grepができたら、実際に名前を変更したいのですが。

これは私が今までに試したことです:

ls > try-expression
grep -E '^[0-9]+' try-expression

上記で正しい結果が得られました。次に、次のステップを試しました。

ls | xargs -0 grep -E '^[0-9]+'
ls | xargs -d '\n' grep -E '^[0-9]+'
find . -name '[0-9]+' -exec grep -E '^[0-9]+' {} \;
ls | parallel bash -c "grep -E '^[0-9]+'" - {}

同様ですが、「ファイル名が長すぎます」または出力がまったくないなどのエラーが発生しました。別々のコマンドの式がうまく機能するので、問題はxargsまたはfindの使用方法にあると思います。

ご協力ありがとうございました

4
Luigi Tiburzi

ディレクトリ内の番号で始まるすべてのファイルを一覧表示するには、

find . -maxdepth 1 -regextype "posix-egrep" -regex '.*/[0-9]+.*\.mp3' -type f

あなたのアプローチの問題は、findがファイルの相対パスを返し、ファイル名自体を期待していることです。

5

条件付き に正規表現を指定してbashのみを使用して実行できることを次に示します。

#! /bin/bash

# get all files that start with a number
for file in [0-9]* ; do
    # only process start start with a number
    # followed by one or more space characters
    if [[ $file =~ ^[0-9]+[[:blank:]]+(.+) ]] ; then
        # display original file name
        echo "< $file"
        # grab the rest of the filename from
        # the regex capture group
        newname="${BASH_REMATCH[1]}"
        echo "> $newname"
        # uncomment to move
        # mv "$file" "$newname"
    fi
done

サンプルファイル名で実行すると、出力は次のようになります。

< 01 American Idiot.mp3
> American Idiot.mp3
< 01 Articolo 31 - Domani Smetto.mp3
> Articolo 31 - Domani Smetto.mp3
< 01 Bohemian rapsody.mp3
> Bohemian rapsody.mp3
< 01 Eye of the Tiger.mp3
> Eye of the Tiger.mp3
< 04 Halo.mp3
> Halo.mp3
< 04 Indietro.mp3
> Indietro.mp3
< 04 You Can't Hurry Love.mp3
> You Can't Hurry Love.mp3
< 05 Beautiful girls.mp3
> Beautiful girls.mp3
< 16 Apologize.mp3
> Apologize.mp3
< 16 Christmas Is All Around.mp3
> Christmas Is All Around.mp3
4
Mat

Debian、Ubuntu、および派生物では、renamePerlスクリプトを使用します。

名前変更操作をシミュレートするには:

    rename 's/^\d+ //' * -n

-n(動作なし)を削除して、操作を実行します。

    rename 's/^\d+ //' *

運が良ければ、Perlの名前変更もディストリビューションに/usr/bin/renameとしてインストールされます(FedoraもPerlの名前変更を使用しているという噂があります)。

他の機能の詳細については、 Perlの名前変更のマニュアルページ を参照してください。

4
Ole Tange

zmv :を使用すると、zshでは比較的簡単です。

zmv '[0-9]## #(*.mp3)' '$1'

説明:[0-9]## #は、1つ以上の数字とそれに続く0つ以上のスペースに一致するパターンです。上記のコマンドは、このパターンで始まり、.mp3で終わるすべてのファイルの名前を、括弧で囲まれた部分に変更します。

ファイルの先頭から数字を削除する数行をオブジェクトRexxに記述しました。私のファイルは次のようなものでした:

データ:

003. Atomic Rooster.mp3
087. Crowded House.mp3

コード:

#!/bin/rexx
'rxqueue /clear'
'ls | rxqueue'
do while queued()>0
 parse pull fn
 parse var fn .'.'rest
 rest = strip(rest)
 if pos('.',rest)=0 then iterate
 "mv '"fn"' '"rest"'"
end
0