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