サブディレクトリの最後のファイルを除くすべてのファイルを削除するには、[検索]を使用します。

サブディレクトリの最後のファイルを除くすべてのファイルを削除するには、[検索]を使用します。

複数のサブディレクトリにある重複ファイルを削除してスペースを確保したいと思います。しかし、私はいつもファイルトランクの最後のファイルを保持したいと思います。たとえば、次のような分類があります(触れないでください他のファイルの横に)。

FILE_1-1 FILE_1-2 FILE_1-3 FILE_2-1 FILE_2-2

いくつかのサブディレクトリにあります。FILE_2-2この場合はアーカイブしたいのですが、他のフォルダにはアーカイブされますFILE_3-1。常に最後のファイルです。私はサブディレクトリをうまく繰り返すためにfindコマンドを使ってそれらをすべて削除する方法を知っています。

find . -name "FILE_*" -type f -delete

FILE_*findコマンドを使用して各ディレクトリの最後の削除を除外するにはどうすればよいですか?Google検索(https://www.unix.com/shell-programming-and-scripting/36639-find-remove-all-but-latest-file.html) 以下の結論を得た。

ls -1 FILE_* | sort -r | tail +2 | xargs -i rm {}

ただし、このコマンドはブランチディレクトリでは機能しません。そうですか?

答え1

ディレクトリに「茎」があります。

ls * | sed -r 's/[0-9]+$//' | sort | uniq

各ステムについて、最後の単語のすべてのファイルを一覧表示できます。

ls  FILE_1-* | head -n -1

または最新の状態を維持したい場合:

ls -rt FILE_1-* | head -n -1

どちらのコマンドも後で| xargs rm出力を削除できます。

すべてを短いスクリプト(*)に入れて、次を実行します。

find . -type d -exec {the_script} {} \;

(*)短いスクリプトは次のとおりです。

#! /bin/bash
cd "$1"  # takes the directory as a parameter
for stem in $(ls FILE* | sed -r 's/[0-9]+$//' | sort | uniq)
do 
    ls -rt ${stem}* | head -n -1 | xargs echo rm 
done

もちろん、徹底的にテストし、正しいファイルが削除されることを確認したら、交換してくださいecho rmrm

関連情報