5つの最新ファイルを「新しいものから古いものへ」の順序でディレクトリから別のディレクトリにコピーするにはどうすればよいですか。
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
に注意してください)
ファイル名に改行文字が含まれていないと仮定します。
IFS='
'
set -f
for i in `ls -t /path/to/sourcedirectory | head -n 5`
do
cp "/path/to/sourcedirectory/$i" /path/to/destdirectory/
done
ファイル名に改行が含まれていないと仮定すると、次のようになります。
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
上記の回答から、ファイル名に改行が含まれていない場合の同様の条件を想定すると、次のようになります。
ls -t | head -n5 | xargs -I{} mv {} $destination_dir
これで十分です。
最新の5つのファイルを除くすべてのファイルを削除します。
find -type f -printf '%T@ %P\n' | sort -n | cut -d' ' -f2- | head -n -5 | xargs rm
後でファイルを別の場所にコピー/移動するために簡単に適応させることができます。