コマンドを使用してディレクトリとそのサブディレクトリ内のすべてのファイルを見つけて、出力をresult.txtファイルにリダイレクトすると、result.txtファイルからresult.txtを含むすべてのファイルを取得できますが、望ましくありませんでした。結果。txt。
私がやっているように
find . -type f > allfiles.txt
その結果、私が得るものは
./test1/test3/file4
./test1/file3
./test2/test4/file6
./test2/file5
./allfiles.txt
この状況を避ける方法は?
答え1
具体的には、find
次のようにできます。
find . ! -path ./allfiles.txt -type f > allfiles.txt
より一般的には、moreutilsコマンドを使用して、コマンドが返されるまで出力ファイルの作成を遅らせることができますsponge
。
ls -lRA | sponge allfiles.txt
ただし、これは出力全体をメモリに保存することを意味します。
moreutilsがインストールされていない場合(通常はデフォルトではインストールされていない)、次のように実装できますsponge
。
sponge() {
perl -0777 -e '$text=<STDIN>;
open STDOUT, ">", shift or die$!;
print $text' -- "$@"
}
答え2
つまり、findが実行されているのと同じディレクトリにallfiles.txtファイルを置かないでください。次のように他の場所に入れてください。
find . -type f > /tmp/allfiles.txt
または、同じディレクトリにある必要がある場合は、grepを使用してフィルタリングします。
find . -type f | grep -vxF ./allfiles.txt > allfiles.txt
(他のファイルが./foo\n./allfiles.txt
呼び出されないと仮定)