2012-10-28 54 views
1
for i in `ls -lrt|grep ^d|cut -d ' ' -f 13-` 
do 
      cd $i 
      ls 
      cd ../ 
done 

在上面的例子中,我期待腳本進入每個目錄,填充該目錄的所有文件,從它出來,然後進入其他目錄並打印它的內容。請在這裏建議最新的錯誤。Shell腳本沒有給出正確的輸出

+2

爲什麼不只是'爲F *;如果[-d「$ f」];那麼ls「$ f」;網絡連接;完成' – Amber

+0

你看到的輸出是什麼?在循環中添加echo $ i,並檢查ls命令是否正確。 – SidJ

+0

它進入一個目錄我猜第一個,然後它無法進入其他目錄和輸出說ca'nt cd到(目錄名稱) – Kunal

回答

0

執行以下操作之一是否在執行您正在查找的任務?

ls * 
ls * -r 
1

因爲有可變數目的每個場之間的空間在Ls -ltr輸出,由於LS格式化和可變長度的文本字段的反覆無常cut命令不能正常工作。解析文件名了LS目錄列表的更可靠的方法是替換AWK剪切命令「{打印$ 9}」,所以for循環應該是這樣的:

for i in `ls -lrt|grep ^d| awk '{print $9}'` 
+0

awk是這樣的事情最好.. – doniyor

1

請檢查字段13是所需字段,它是ls命令輸出的最後一個字段。在我的系統中,它是第九個領域。所以通過我將您的代碼更改爲,

for i in `ls -lrt|grep ^d|cut -d ' ' -f9` 
do 
     echo "Directory -$i" 
     cd $i 
     ls 
     cd ../ 

done 

它在此更改後正常工作。

你也可以使用其他命令來執行它,比如sed,awk。我用awk做了它,但不是硬編碼的任何字段值(使用內部變量NF - 字段數,以獲取最後一個字段,它應該是目錄的名稱)。

#for i in `ls -lrt|grep ^d|cut -d ' ' -f9` 
for i in `ls -lrt|grep ^d|awk '{print $NF}'` 

do 
     echo "Directory -$i" 
     cd $i 
     ls 
     cd ../ 

done 

這也工作得很好。

0

絕對不要對「ls中的文件」做任何變化,因爲它的名稱中包含空格的文件將失敗。所有你需要的是:

find . -print 

,如果你想要做的事,在當前目錄下的每個文件,那麼它只是

for file in * 
do 
    printf "Working on %s\n" "$file" 
    <do stuff with "$file"> 
done 

或所有子目錄太然後使用xargs的還是:

find . -print | 
while IFS= read -r file 
do 
    printf "Working on %s\n" "$file" 
    <do stuff with "$file"> 
done 

雖然後者與任何基於管道的解決方案一樣,將會因其名稱中帶有換行符的文件而失敗。

0

遍歷只在當前目錄下的目錄,使用該模式*/,所以

for dir in */; do 
    cd "$dir" 
    do stuff 
    cd .. 
done