web-dev-qa-db-ja.com

あるディレクトリから別のディレクトリに5つの最新ファイルをコピーし、古いコピーを削除する方法

5つの最新ファイルを「新しいものから古いものへ」の順序でディレクトリから別のディレクトリにコピーするにはどうすればよいですか。

3
vikke

zshの場合:

cp -- *(om[1,5]) /dest/dir

または:

cp -- *(.om[1,5]) /dest/dir

通常のファイルのみに制限します。

bashまたはksh93およびGNU ls

eval "sorted_files=($(ls -t --quoting-style=Shell-always))"
cp -- "${sorted_files[@]:0:5}" /dest/dir

(これらは隠しファイルを無視することに注意してください。Dグロブ修飾子または-Aオプションをlsに追加してそれらを含めます)。

5つの古いものを削除するには、逆の順序で同じです。

rm -- *(.Om[1,5])

Oではなくoに注意してください)。または:

eval "sorted_files=($(ls -rt --quoting-style=Shell-always))"
rm -- "${sorted_files[@]:0:5}"

-rに注意してください)

2

ファイル名に改行文字が含まれていないと仮定します。

IFS='
'
set -f
for i in `ls -t /path/to/sourcedirectory | head -n 5`
do
  cp "/path/to/sourcedirectory/$i" /path/to/destdirectory/
done
1
Ankit

ファイル名に改行が含まれていないと仮定すると、次のようになります。

ls -t | head -n5 | while IFS= read -r fname
do
    cp -- "$fname" newdir/
done

さらに、古いコピーを削除する場合は、mvの代わりにcpを使用します。

ls -t | head -n5 | while IFS= read -r fname
do
    mv -- "$fname" newdir/
done
1
John1024

上記の回答から、ファイル名に改行が含まれていない場合の同様の条件を想定すると、次のようになります。

ls -t | head -n5 | xargs -I{} mv {} $destination_dir

これで十分です。

1
Sriram

最新の5つのファイルを除くすべてのファイルを削除します。

find -type f -printf '%T@ %P\n' | sort -n | cut -d' ' -f2- | head -n -5 | xargs rm

後でファイルを別の場所にコピー/移動するために簡単に適応させることができます。

ソース: https://stackoverflow.com/questions/16190845/trying-to-delete-all-but-most-recent-2-files-in-sub-directories

1
BlackPioter