如何將每個子目錄中的檔案名稱收集到該子目錄中的文字檔案中?

如何將每個子目錄中的檔案名稱收集到該子目錄中的文字檔案中?

我想將每個子目錄中的所有檔案的名稱儲存到該子目錄中的文字檔案中,所以我編寫了以下腳本:

#!/bin/bash
for X in "$PWD" *
do  
    if [ -d "$X" ];
    then
        cd "$X"
        files="$(ls)"
        echo "$files" >> filesNames.txt
    fi
done

但是,我無法使用以下命令進入子目錄:

cd "$X"

這裡有什麼問題嗎?

答案1

根據您的評論,您只需深入一層即可。在這種情況下,您可以使用 glob 迭代目錄名稱,並為每個目錄保存數組中的檔案路徑,然後將每個路徑的最後一個元素列印到fileNames.txt

#!/bin/sh

for dir in "$PWD"/*/; do
arr=( "$dir"* )
printf %s\\n "${arr[@]##*/}" > "$dir"filesNames.txt
done

要排除符號鏈接,只需添加一個條件,例如if [[ ! -L "${dir%?}" ]]; then arr...

答案2

您需要cd先退出每個子目錄,然後再嘗試下一個子目錄。插入...

cd ..

在循環結束時將為子目錄修復此問題,但當您首先在頂級目錄中執行此操作時會中斷。從cd ..那裡開始將帶您進入另一個級別,因此其他目錄不再可見。

您可以透過將頂級目錄保存在變數中來解決所有這些問題,並且cd每次都保存到那裡:

#!/bin/bash

TOPDIR="$PWD"
for X in "$PWD" * ; 
do
        if [ -d "$X" ] ;
        then
                cd "$X"
                files="$(ls)"
                echo "$files" >> filesNames.txt
                cd "$TOPDIR"
        fi
done

如果您不想保留先前運行的所有結果,您可能還需要變更>>為。>

答案3

#!/bin/bash
for X in $PWD/* ; do
        if [ -d "$X" ] ; then # first depth directories
                cd "$X" ;
                files="$(ls)" ;
                printf "$files\n" >> filesNames.txt ;
        else # regular files:
                printf "$X\n" >> fileNames.txt ;
        fi ;
done ;

您想要實現的目標可能可以使用-對每個選項find使用附加選項 ( ) - 例如:man find$X

files=$(find ${PWD} -type f) ;
printf "$files\n" >> filesNames.txt ;

答案4

試試這個:

find . -type d -exec sh -c "cd {} ; ls | grep -v '^filesNames.txt$' > filesNames.txt" \;

這將找到當前目錄下的所有目錄,並且對於每個目錄,它cd都會進入該目錄並將目錄清單寫入 a filesNames.txt(從清單中排除該檔案)。

如果您希望這些filesNames.txt檔案也出現在清單中,請| grep -v ...從命令中刪除:

find . -type d -exec sh -c "cd {} ; ls > filesNames.txt" \;

相關內容