2016-12-06 8 views
1

ディレクトリーツリー内の特殊文字と空白で最も古いファイルを見つけて削除するにはLinux bashスクリプトの構築に役立つ助けが必要です条件が満たされた場合。ディレクトリツリー内の特殊文字と空白で最も古いファイルを見つけて削除する場合

私はこのような質問をフォーラムで検索しています。ユーザーのおかげで、私は下に見られるように出力を得ました。これまでは、出力ファイル名をrmにパイプして削除する方法を理解できませんでした。

目的は、hddが完全に実行されているかどうかをチェックし、そうであれば空き領域要件が満たされるまで最も古いファイルを削除することです。問題は

この

は私がなってしまったものです...ファイル名は、特殊文字と白いスペースで満たされていること、である(ここでは、ユーザーに感謝!):出力を与える

find /mnt/volume0/recordings/ -type f -printf '%T+ %p\n' | sort | head -q -n 1 | cat 

2016-03-11+19:21:44.2814042100 /mnt/volume0/recordings/some folder (R)/some filename (R)2016-03-1119-00.ts 

ファイルを削除するためにrmにパイプされたすべての特殊文字と空白を含むファイルへのフルパス名を選択するにはどうすればよいですか? anwered POST1からの出力:

[email protected]:~# find /mnt/volume0/recordings/ -type f -printf '%T+ %p\n' | sort -d | head -n1 
2016-03-11+19:21:44.2814042100 /mnt/volume0/recordings/VIDEO_FILE (R)/VIDEO_FILE (R)2016-03-1119-00.ts 
[email protected]:~# find /mnt/volume0/recordings/ -type f -printf '%T+ %p\n' | sort -d | head -n1 | xargs -I{} echo rm -f "{}" 
rm -f 2016-03-11+19:21:44.2814042100 /mnt/volume0/recordings/VIDEO_FILE (R)/VIDEO_FILE (R)2016-03-1119-00.ts 
[email protected]:~# find /mnt/volume0/recordings/ -type f -printf '%T+ %p\n' | sort -d | head -n1 | xargs -I{} rm -f "{}" 
[email protected]:~# find /mnt/volume0/recordings/ -type f -printf '%T+ %p\n' | sort -d | head -n1 
2016-03-11+19:21:44.2814042100 /mnt/volume0/recordings/VIDEO_FILE (R)/VIDEO_FILE (R)2016-03-1119-00.ts 

編集:ここでは

は答えポストから出力されます。 ...

をsorontar提案からの出力、まだ動作していないが、新しい提案が唯一のディレクトリ名を与え、ファイルではありませんNEW出力:ま​​だ...

EDIT2に動作していない

[email protected]:~# find /mnt/volume0/recordings/ -type f -printf '%T+ %p\0' | sort -zk1,1 | head -n1 -z | cut -zd ' ' -f2 
/mnt/volume0/recordings/Parneviks 
[email protected]:~# find /mnt/volume0/recordings/ -type f -printf '%T+ %p\0' | sort -zk1,1 | head -n1 -z | cut -zd ' ' -f2 | xargs -0 -I{} echo rm -f "{}" 
rm -f /mnt/volume0/recordings/Parneviks 

最も古いもののファイルは

[email protected]:~# find /mnt/volume0/recordings/ -type f -printf '%T+ %p\0' | sort -zk1,1 | head -n1 -z 
2016-03-11+19:21:44.2814042100 /mnt/volume0/recordings/Parneviks (R)/Parneviks (R)2016-03-1119-00.ts 

です。

EDIT3: -f2の代わりに-f2を使用しました。皆さん、ありがとうございました!

正しい行は次のようになります。

find /mnt/volume0/recordings/ -type f -printf '%T+ %p\0' | sort -zk1,1 | head -n1 -z | cut -zd ' ' -f2- | xargs -0 -I{} rm -f "{}" 
+1

問題が解決してうれしいです!それは、未来のために答えを質問に編集すべきではないということです。質問と回答を別々にすることは、コミュニティがそれぞれのメリットで投票することができるということです。 (ここでは良い答えがありますが、*良い答えがない*場合は、質問に編集するよりも自分の答え*を回答*として追加する方が良いでしょう)。 –

+0

(同様に、気になる人のための完全なdiff形式の編集履歴を持つインターフェースを実際に持っているので、ローカルの設定では、以前に見たことのない人にできるだけ明確に読むための質問と回答を書く/編集することです。最後に呼び出された編集を持っている)。 –

+0

申し訳ありません。これは私の最初の投稿でした。私はちょうど問題を解決したことを明確にしようとしました。私は将来を考えています。再びすべての貢献者に感謝します。 – greddost

答えて

3

あなたが本当にスペース、改行や任意の特殊文字を含むファイルを処理したい場合、あなたはこのように、ファイル名の制限としてnull \0を使用することを検討する必要があります。

dir=/mnt/volume0/recordings 

find "$dir"/ -type f -printf '%T+ %p\0' | 
    sort -zk1,1 | 
    head -n1 -z | 
    cut -zd ' ' -f2- | 
    xargs -0 echo rm -f -- 

これはディレクトリ内のファイルを検索し、最も古いファイル(1つだけ)を強制的に削除します(エコーが削除されている場合は、実際に使用する前にテストします)。

+0

ありがとうございました! null演算子を使用します。 出力を表示するには、残念なことにファイルのディレクトリ名のみを出力します。 ファイルはディレクトリツリーのサブフォルダにありますが、問題があるかどうかわかりません。 – greddost

+1

ファイル名にスペースがあると、 'cut -f2'は動作しません。おそらく '-f2'ではなく-f2-を意味していたでしょうか? –

+1

( '-I {}'を使用しないことをお勧めします。ただし、 'xargs -0 rm -f --'は、' rm'呼び出しを減らしてジョブを実行し、 'xargs私はそれを持って来ます)。 –

関連する問題