次のbash
スクリプトは、すべてのディレクトリを検索し、各ディレクトリにあるファイルの数を一覧表示します。
以下は、私が直接インストールしたRインストールのサンプル出力テストです。まさに私が必要だったのです。
find . -mindepth 6 -type d -print0 | while IFS= read -r -d '' i ; do echo -n $i": " ; ls -p "$i" | grep -v / | wc -l ; done
私の質問は、この出力「files.txt」(たとえば)を次のような他のステートメントでどのように読み取ることができるかということです。
xargs rm -f files.txt # ("<" is missing)
すべてのディレクトリを含むfiles.txtの内容を読み、複数のファイルを含むディレクトリ内のすべてのファイルを削除しますか(フォルダ以外のファイルのみ、ディレクトリ構造を変更しないでください)。
以下の出力では、以下を除く各ディレクトリのすべてのファイルが削除されます。
./R/R-3.6.1/src/library/tcltk/R/windows: 1
./R/R-3.6.1/src/library/compiler/man: 1
./R/R-3.6.1/src/library/compiler/R: 1
出力例:
./R/R-3.6.1/src/library/tools/man: 64
./R/R-3.6.1/src/library/tools/tests: 3
./R/R-3.6.1/src/library/tools/src: 16
./R/R-3.6.1/src/library/tools/po: 23
./R/R-3.6.1/src/library/tools/R: 49
./R/R-3.6.1/src/library/tcltk: 4
./R/R-3.6.1/src/library/tcltk/man: 14
./R/R-3.6.1/src/library/tcltk/exec: 12
./R/R-3.6.1/src/library/tcltk/src: 7
./R/R-3.6.1/src/library/tcltk/po: 21
./R/R-3.6.1/src/library/tcltk/R: 6
./R/R-3.6.1/src/library/tcltk/R/unix: 2
./R/R-3.6.1/src/library/tcltk/R/windows: 1
./R/R-3.6.1/src/library/tcltk/demo: 5
./R/R-3.6.1/src/library/compiler: 4
./R/R-3.6.1/src/library/compiler/man: 1
./R/R-3.6.1/src/library/compiler/noweb: 2
./R/R-3.6.1/src/library/compiler/tests: 10
./R/R-3.6.1/src/library/compiler/po: 10
./R/R-3.6.1/src/library/compiler/R: 1
./R/R-3.6.1/src/library/graphics: 4
ありがとうございます。
ベストアンサー1
ファイルを読み取るには、各行がリストされているディレクトリ内のすべてのファイルを削除するというrm
意味のある形式である必要があります。rm
rm ./path/to/delete/*
だから…。
sed -E "s|:\s[0-9]+$|/*|" files.txt
ファイルの各シーケンスの空白、1つ以上の数字とsed
行末:
を\s
。[0-9]+
$
/*
そのまま入力するとrm
ディレクトリの削除も要求されるためエラーとなりますので、メッセージにエラーが表示された場合はstderrをリダイレクトしてください。
rm $(sed -E "s|:\s[0-9]+$|/*|" files.txt) 2>/dev/null
ディレクトリ名にスペースが含まれていると失敗します。この場合、まだファイルをに提供する必要があります。後で変更してリセットrm
できます。IFS
OFS=$IFS; IFS=$'\n'; rm $(sed -E "s|:\s[0-9]+$|/*|" files.txt) 2>/dev/null; IFS=$OFS