リダイレクトされたファイルリストの出力でファイル名を無視する方法は?

リダイレクトされたファイルリストの出力でファイル名を無視する方法は?

コマンドを使用してディレクトリとそのサブディレクトリ内のすべてのファイルを見つけて、出力を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呼び出されないと仮定)

関連情報