私はディレクトリのテキストファイルをクリーンアップするスクリプトを書いています。 (悪い考えだということはわかりますが必須です。) 次のように書いています。
#!/bin/bash
var=$(ls -p /direcotry/to/file | grep -v /)
truncate -s 0 $var
問題は、スクリプトを実行すると、そのディレクトリ内のすべてのファイルがスクリプトを起動したディレクトリにコピーされ、元のディレクトリのファイルが変更されていないことです。この動作が発生する理由と回避策は何ですか?
ベストアンサー1
これは、コマンドの出力がls
パスではなくファイル名のリストであるためです。したがって、このtruncate
コマンドは現在のディレクトリの空のファイルと同じファイル名を再作成します。
また、正しく実行されても、より複雑なファイル名(改行やバックスラッシュなどを含む)は言うまでもなく、わずかに奇妙なファイル名(スペースなど)ではアプローチが中断されます。
まず、スクリプトを書く必要はありません。ファイルのリストを次に渡すことができますtruncate
。
truncate -s 0 /direcotry/to/*
ディレクトリが見つかったら、truncate
エラーのみを印刷して次の項目に進みます。
truncate: cannot open ‘foo’ for writing: Is a directory
これをよりきれいにするには、次のものを使用できますfind
。
find /direcotry/to/file -type f -exec truncate -s {} +
またはシェルグローブ:
for f in /direcotry/to/file; do
[ -f "$f" ] && truncate -s "$f"
done