2016-09-21 7 views
1

私の目標は、ディレクトリ内のすべてのファイルを空にすることです。私は実際にファイルを削除したくない、私はちょうどその内容を削除したい。リダイレクトシンボルをfind -execと組み合わせて使用​​する方が良い

あなたは私はディレクトリ内のすべてのファイルに対してこの操作を実行したい場合は、私はこれを行うことができます> file.txt

を行うことができ、単一のファイルでこれを行うにしたい場合:

find . -exec /bin/bash -c '> {}' \; 

お知らせ方法上記のコマンドは/bin/bashを呼び出す必要があります。これは単に次のようなコマンドを実行しているためです。find . -exec > {} \;find: invalid argument ;' to -exec'と言います。これは、リダイレクト記号がコマンドを混乱させるためです。私は/bin/bashどのようにこれを行うことができますか?

-exec内を実行するために必要とせずにこのコマンドを実行したいと思います

これを行うには

答えて

2

一つの簡単な方法は、truncateを使用することです:

find -type f -exec truncate -s0 {} + 

あなただけのbashを使用する場合は、whileループ使用することができますあなたが「didnの場合、最後に

find -type f -print0 | 
    while IFS= read -r -d '' file; do 
     > "$file" 
    done 

を心臓がbash -cを使用しているので、bashを何回も呼び出さないように、次のようにしてください。

find -type f -exec bash -c 'for file; do > "$file"; done' - {} + 

私はその解決策が嫌いですが。

+0

いいです。最初のものは完璧です。 '-s0'は何をするのですか?私はそれに関する情報を見つけることができませんでした。 – noobcoder

+0

'-s0'は、ファイルを0バイトに切り捨てることを意味します。 – redneb

+0

あなたが気に入らない解決策は、 'find'-with-' print0'よりももっと慣用的で(ポータブルな)面白いです。 –

関連する問題