Find
從文件名中刪除數字
我在修改
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
返回文件的相對路徑,而您只是期望文件名本身。
這是您可以使用 only 做的事情,在條件
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