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ではありません)。
最初にgrep
をfind -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
の使用方法にあると思います。
ご協力ありがとうございました
ディレクトリ内の番号で始まるすべてのファイルを一覧表示するには、
find . -maxdepth 1 -regextype "posix-egrep" -regex '.*/[0-9]+.*\.mp3' -type f
あなたのアプローチの問題は、find
がファイルの相対パスを返し、ファイル名自体を期待していることです。
条件付き に正規表現を指定して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
Debian、Ubuntu、および派生物では、rename
Perlスクリプトを使用します。
名前変更操作をシミュレートするには:
rename 's/^\d+ //' * -n
-n
(動作なし)を削除して、操作を実行します。
rename 's/^\d+ //' *
運が良ければ、Perlの名前変更もディストリビューションに/usr/bin/rename
としてインストールされます(FedoraもPerlの名前変更を使用しているという噂があります)。
他の機能の詳細については、 Perlの名前変更のマニュアルページ を参照してください。
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