Bash

列出帶有空格的文件夾的循環

  • July 20, 2018

方法

我有一個隨機命名文件夾的目錄,帶有空格和句點。

我創建了一個小循環(在腳本中),目的是重命名這些文件夾。基於這些是我的目錄(test 和 empty):

$ ls -la
./
../
35._JK_io/
'43A. io kl_ -'/
'Mi.Nombre.es Adios'/

注意:我們已嘗試 (creo) 列出所有可能性,並在區分目錄和文件夾時起作用。

現在,我繼續創建一個循環,以便僅列出目錄並(將來)重命名它們:

for archives in `sh -c 'ls -q */' sh`

do

echo  "$archives"
done

問題

問題是當我執行腳本時,我得到:

35._JK_io/:
43A.
io
kl_
-/:
Mi.Nombre.es
Adios/:

問題

如何防止這種情況發生在我身上並以空格和僅三個文件的形式出現?

觀察

在它獲得的文件夾上執行其他腳本時,這35._JK_io /是一個目錄,但其他兩個不是

謝謝!!

在遍歷目錄時,尤其是當這些目錄具有時髦的名稱時,不要遍歷ls. 通常,在程序之間傳遞路徑名需要非常小心,因為 Unix 文件名可能包含除/nul 字元 ( \0) 之外的任何字元。

反而

for dirname in ./*/; do
   printf 'Directory name is "%s"\n' "$dirname"
done

/模式中的最後一項./*/使模式僅擴展到目錄。執行此操作時,該dirname變數將獲得類似的值./some directory name/。我包括./在模式的開頭,但如果你願意,你可以刪除它。請注意,如果您的目錄-名稱中的第一個字元是破折號 ( ),那麼您稍後將不得不使用 eg mv -- "$dirname" "$newname"(帶有--) 來停止mv將名稱中的破折號解釋為命令行選項。在./的開頭$dirname--不需要 。

引用變數擴展非常重要,否則 shell 會在值上進行分詞和文件名通配。

有關的:

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