Find

從文件名中刪除數字

  • September 21, 2020

我在修改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]+'" - {}

和類似的,但我得到了類似“文件名太長”或根本沒有輸出的錯誤。我想問題是我使用的方式xargsfind單獨命令中的表達式效果很好。

謝謝您的幫助

要列出目錄中以數字開頭的所有文件,

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

引用自:https://unix.stackexchange.com/questions/39595