2017-08-24 283 views
0

我想將它添加到Automator並讓用戶選擇它運行的目錄。一個雲端硬盤不會上傳包含空間的文件。我設法刪除所有空格,但不刪除從開始和結束的所有空間。Bash腳本刪除目錄中所有文件的前導和尾部空格

我的代碼:

for f in "$1"/*; do 
    dir=$(dirname "$f") 
    file=$(basename "$f") 
    mv "$f" "${dir}/${file//[^0-9A-Za-z.]}" 
done 
+0

目前尚不清楚,但我認爲你是在談論文件*名稱*而不是文件*內容*。你可以簡單地使用'for'或'while'循環,或者用'-maxdepth 1'來查找''(除非你需要一個遞歸查找),並且由於你使用的是bash,你可以使用參數擴展去除前導並尾隨空白。 –

回答

2
#!/usr/bin/env bash 

shopt -s extglob      # Enable extended globbing syntax 
for path in "$1"/*; do 
    file=${path##*/}      # Trim directory name 
    file=${file##+([[:space:]])}   # Trim leading spaces 
    file=${file%%+([[:space:]])}   # Trim trailing spaces 
    if [[ $file != "${path##*/}" ]]; then # Skip files that aren't changed 
    mv -- "$path" "$1/${file}" 
    fi 
done 

注:

  • 一個shell需要與bash,不sh,啓動以確保擴展名(如extglobbing和[[ ]])可供選擇。
  • 有沒有必要撥打dirname,因爲我們總是知道目錄名稱:它在$1
  • extglob語法擴展了常規glob表達式,使其具有與正則表達式相媲美的功能。 +([[:space:]])是「一個或多個空格」的extglob,而${var%%pattern}${var##pattern}分別從變量值的後面或前面刪除儘可能多的匹配pattern的字符。
  • 當文件名不需要更改時,運行mv毫無意義,所以我們可以通過首先檢查來優化一點。
+0

如何在Automator中調用它,以便我的用戶可以選擇dir來運行它?我要求一個Finder物品。然後將其設置爲Var,運行一個shell腳本。 –

+0

不能告訴你 - 我的專長領域是bash,而不是Automator。但是,如果您可以從Automator成功啓動原始腳本,則希望使用相同的機制來處理新腳本。 –

+0

這是* extglob *擴展模式匹配*選項的亮點,如果沒有它,最終會出現'file =「$ {file#」$ {file %% [![:space:]] *}「}」 ''和'file =「$ {file ## * [![:space:]]}}}」'要完成同樣的事情(更加麻煩......) –

相關問題