
我對此只了解一點點。以下命令刪除所有檔案名稱中的空格。
find . -type f -name "* *.*" -exec bash -c 'mv "$0" "${0// /}"' {} \;
我希望它也刪除逗號、句點和括號(
、 ,
、 .
和 ),但我不知道在命令中的哪個位置放置我想要刪除的字元(
。 )
答案1
簡短的答案是:從檔案名稱中刪除空格、逗號、句點和括號的指令 $0
是
mv "$0" "${0//[ ,.()]/}"
但不要用那個…
更長的答案:
你的
find
命令說-name "* *.*"
。選擇名稱至少包含一個空格的文件 隨後至少有一個句點。 不要嘗試處理名稱不包含空格的檔案是有意義的,因為如果沒有空格,則沒有任何內容可以刪除。但我不知道為什麼該命令正在測試一段時間。它將重命名fat cat.txt
為fatcat.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
刪除“ ”。
順便說一句,如果任何文件帶有 .
它們的名稱位於名稱中包含空格的目錄中。