![為什麼我的 ls 輸出循環不起作用?](https://rvso.com/image/36415/%E7%82%BA%E4%BB%80%E9%BA%BC%E6%88%91%E7%9A%84%20ls%20%E8%BC%B8%E5%87%BA%E5%BE%AA%E7%92%B0%E4%B8%8D%E8%B5%B7%E4%BD%9C%E7%94%A8%EF%BC%9F.png)
我正在嘗試將目錄名稱輸入 for 循環。我的程式碼如下:
td='/Test/TopDir/'
cd "$td"
for x in $(ls -d */ | cut -f1 -d'/'); do
echo x=$x
done
執行 ls 命令時,我執行的頂級目錄如下所示:
ls -l
drwxrwxrwx 4 Jason users 4096 May 6 06:36 2014-02-02 - Jebby (
drwxrwxrwx 3 Jason users 4096 May 6 06:09 2014-02-04 - Jebby (
drwxrwxrwx 2 root root 4096 May 6 06:09 @eaDir
-rw-r--r-- 1 Jason users 3956225 Jan 26 10:17 DSC01062.JPG
-rw-r--r-- 1 Jason users 3927603 Jan 26 10:18 DSC01063.JPG
我的for循環的結果如下:
x=2014-02-02
x=-
x=Jebby
x=(
x=2014-02-04
x=-
x=Jebby
x=(
x=@eaDir
如您所看到的,for 迴圈將目錄名稱分成每個空格後面的子部分。在此範例中,我只希望 For 迴圈對三個目錄執行三次:
- 2014-02-02 - 傑比 (
- 2014-02-04 - 傑比 (
- @eaDir
我究竟做錯了什麼?
答案1
ls
如果可能的話,請避免解析 shell 腳本中的輸出(或至少是檔案名稱部分) 。當檔案名稱包含空格時,它總是會出現分詞問題。
如果你想迭代目錄,你可以使用一個簡單的 shell glob 來實現,即
for d in */; do
echo "$d"
done
此ls
命令只能用於在終端機中以人類可讀的形式顯示目錄列表。
答案2
使用@mikserv的建議, 你可以做
cd /Test/TopDir/
set -- "$PWD" */
cd /somewhere/else
td=$1 ; shift
for x; do
echo x="${td}/$x"
done