從檔案名稱中刪除某些字符

從檔案名稱中刪除某些字符

我對此只了解一點點。以下命令刪除所有檔案名稱中的空格。

find . -type f -name "* *.*" -exec bash -c 'mv "$0" "${0// /}"' {} \;

我希望它也刪除逗號、句點和括號(   、  ,、 .和  ),但我不知道在命令中的哪個位置放置我想要刪除的字元( 。 )

答案1

簡短的答案是:從檔案名稱中刪除空格、逗號、句點和括號的指令 $0

mv "$0" "${0//[ ,.()]/}"

但不要用那個…

更長的答案:

  • 你的find命令說-name "* *.*"。選擇名稱至少包含一個空格的文件 隨後至少有一個句點。  不要嘗試處理名稱不包含空格的檔案是有意義的,因為如果沒有空格,則沒有任何內容可以刪除。但我不知道為什麼該命令正在測試一段時間。它將重命名fat cat.txtfatcat.txt,但會保持hot dog不變frank.fur ter

    由於您想要重命名名稱中包含句點的檔案(以刪除句點),因此您應該將-name測試更改為 -name "*[ ,.()]*".

  • 當您處理事先不知道的檔案名稱時,最好將其放在 --第一個檔案名稱之前。可以說,當你這樣做時,這並不是絕對必要的find . … -exec …,但這是一個值得養成的好習慣。

  • 如果您有名為fat cat.txt和 的文件f a t c a t.txt,它們都將被重新命名為fatcat.txt,第二個文件將破壞第一個文件。傳遞-n(no-clobber) 選項mv 將防止這種情況發生。但要注意:它會留下名稱中帶有空格(等)的文件,而且它甚至可能不會告訴您有問題!

  • 您目前的命令bash為每個檔案呼叫一個新進程。這可能會導致花費比必要的時間更長的時間。最好先調用bash一次,然後調用mv多次。因此,結合以上所有內容,我們有

    find . -type f -name "*[ ,.()]*" -exec bash -c 'mv -n -- "$1" "${1//[ ,.()/}"' sh {} +
    

    可是等等!我們還沒完成!不要使用上面的。

  • find執行命令(使用 -exec)時,它將檔案的路徑名傳遞給命令。如果fat cat.txt目前目錄中 有一個被呼叫的文件,find則會傳遞./fat cat.txt給 bash 指令。上面的命令將嘗試將fat cat.txt( ./fat cat.txt) 重新命名為 /fatcattxt.如果您以 root 身分執行(即 sudo),這會將您的檔案移至根目錄,造成大混亂。 (教訓:除非您確定需要它,否則不要運行命令sudo。)如果您不是以 root 身份運行,那麼「好消息」是該命令不會執行任何操作。

    所以,現在,把它們放在一起,我們得到

    find . -type f -name "*[ ,.()]*" -exec bash -c 'for f do dir="$(dirname "$f")"; base="$(basename "$f")"; echo mv -n -- "$f" "$dir/${base//[ ,.()]}"; done' sh {} +
    

    請注意,我echo在上方包含了一個命令,作為「三思而後行」的措施。如果運行上述命令,它將顯示所有mv需要的命令。如果您覺得沒問題,請再次執行該命令並echo刪除“ ”。


順便說一句,如果任何文件帶有 .它們的名稱位於名稱中包含空格的目錄中。

相關內容