サブディレクトリも含む各ディレクトリのファイルを一覧表示したいと思います。ディレクトリ内では、複数のディレクトリを無視する必要があり、親ディレクトリでも子ディレクトリでもかまいません。以下のスクリプトでは、別のディレクトリを繰り返すことなく、1つのディレクトリ内のファイルのみを一覧表示できます。この問題を解決する方法を教えてください。
私が試したスクリプト
#!/bin/sh
find * -type d | while IFS= read d; do
dirname=`basename $d`
if [ ${dirname} != "Decommissioned" ]; then
cd $dirname
find * ! -name . -prune -type f | while read fname; do
fname=`basename $fname`
echo $fname
done
else
continue
fi
done
答え1
すべての一般ファイルを一覧表示し、次のディレクトリのファイルをスキップしたい場合引退、あなたはします:
find . -name Decommissioned -type d -prune -o -type f -print
GNUのデフォルト名のみを使用するには。またはPOSIXlyにfind
置き換えることもできます。-print
-printf '%f\n'
find . -name Decommissioned -type d -prune -o -type f -exec sh -c '
for file do;
printf "%s\n" "${file##*/}"
done' sh {} +
または、すべてのファイル名に改行文字が含まれていないことを保証できる場合:
find . -name Decommissioned -type d -prune -o -type f -print |
awk -F / '{print $NF}'
答え2
以下のコードは「Decommissioned」ディレクトリを無視し、他のディレクトリのファイルを一覧表示します。
find . -type d | while read DirName
do
echo "${DirName}" | grep "Decommissioned" >/dev/null 2>&1
if [ "$?" -ne "0" ]
then
find ${DirName} -type f | awk -F/ '{print $NF}'
fi
done
コメントに基づいて回答
bash-4.1$ find .
.
./c
./c/c.txt
./c/c2
./c/c2/c2.txt
./c/c1
./c/c1/c1.txt
./a
./a/a.txt
./a/a2
./a/a2/a2.txt
./a/a1
./a/a1/a1.txt
./b
./b/b2
./b/b2/b2.txt
./b/b1
./b/b1/b1.txt
./b/b.txt
bash-4.1$ find . | grep -vE "a/|b2" | grep "\.txt"
./c/c.txt
./c/c2/c2.txt
./c/c1/c1.txt
./b/b1/b1.txt
./b/b.txt