各サブディレクトリのすべてのファイル名をそのサブディレクトリのテキストファイルに保存したいので、次のスクリプトを作成しました。
#!/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" \;