Find

在 macOS 上使用 find 和 mv 重命名目錄

  • June 23, 2021

我正在努力使用重命名目錄和文件的命令。

  • 作業系統:MACOS 11.4
  • 目標:通過用下劃線替換空格來重命名目錄和文件_
  • 命令嘗試:
find . -maxdepth 1 -iname "* *" -exec sh -c 'fichier="{}"; mv -- $fichier ${fichier// /_}' \;

我使用find是因為我希望能夠一次瀏覽目錄樹 1 級的深度。

該命令的結果是:

usage: mv [-f | -i | -n] [-v] source target
      mv [-f | -i | -n] [-v] source ... directory

所以不是mv我用來echo檢查命令

find . -maxdepth 1 -iname "* *" -exec sh -c 'fichier="{}"; echo $fichier ${fichier// /_}' \;

這似乎按我的預期工作:

./Job offers etc ./Job_offers_etc
./School results ./School_results
./Famille et Souvenirs ./Famille_et_Souvenirs
./KID education ./KID_education
./Template Open Office-MS Office ./Template_Open_Office-MS_Office
./Mode Emplois ./Mode_Emplois
./cartres de voeux ./cartres_de_voeux

使用時我做錯了什麼mv

您遇到了建議(幾乎)總是引用您的 shell variables的原因之一。

在您的情況下,由於您為 shell 變數分配了fichier一個包含空格的文件名,因此當您“按原樣”使用該變數時,shell 將執行分詞,即 as $fichier。這意味著Job offers etc作為參數的目錄mv將被解釋為試圖將三個文件移動Joboffers目標etc目錄Job_offers_etc(1)。

為了避免該問題,請在變數引用周圍放置雙引號,如"$fichier".


(1)這實際上可能很危險;在某些設置中,如果目標目錄不存在,該命令可能會導致三個文件重命名為相同名稱,從而有效地覆蓋前兩個文件。

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