Bash

遍歷名稱中帶有空格的目錄

  • July 25, 2020

我正在嘗試編寫一個循環遍歷目錄的腳本,並重命名子目錄中的文件以匹配目錄名稱。我遇到了一個問題,如果一個目錄的名稱中有空格,那麼該名稱就會被拆分,我無法像我需要的那樣對它做任何事情。

例如,文件夾結構為:

TopLevel
->this is a test
-->test.txt

到目前為止,我的腳本是:

#!/bin/sh
topLevel="/dir1/dir2/TopLevel"
for dir in $(ls $topLevel)
do
   echo $dir # for testing purposes to make sure i'm getting the right thing
   # Get name of directory - i know how to do this
   # Rename file to match the name of the directory, with the existing extension - i know how to do this
done

我的預期輸出是

/dir1/dir2/TopLevel/this is a test

但是,實際輸出是

this
is
a
test

有人可以指出我正確的方向嗎?自從我完成 shell 腳本以來已經有一段時間了。我正在嘗試一次完成這個腳本,但我似乎一直在堅持下去。

這是您永遠不應嘗試解析ls. 如果你只使用 shell glob,你可以這樣做:

for dir in /dir1/dir2/TopLevel/*/
do
   echo "$dir" ## note the quotes, those are essential
done

註釋

  • 請注意我如何使用for dir in /dir1/dir2/TopLevel/*/而不僅僅是for dir in /dir1/dir2/TopLevel/*. 這是僅迭代目錄。如果您想要目錄和文件,請使用for f in /dir1/dir2/TopLevel/*.
  • 引號$dir是必不可少的,您應該始終引用變數,特別是如果它們包含空格。

進一步閱讀:

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