ls 出力を変数に割り当てると、予期しない動作が発生します。

ls 出力を変数に割り当てると、予期しない動作が発生します。

私はディレクトリのテキストファイルをクリーンアップするスクリプトを書いています。 (悪い考えだということはわかりますが必須です。) 次のように書いています。

#!/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

おすすめ記事