Как скопировать 5 новейших файлов от одного каталога до другого и удалить старые копии

sed 's_\(/.*/.*\)/.*_\1_' your-file.txt

Это - пример:

>sed 's_\(/.*/.*\)/.*_\1_' your-file.txt
/tutordashboard/manageTutorLogInStatus
/tutordashboard/manageTutorLogInStatus
3
24.06.2014, 02:26
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 спецификатор globbing, или -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
27.01.2020, 21:14

Принимающие имена файлов не содержат символы новой строки:

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
27.01.2020, 21:14

При условии, что имена файлов не содержат новые строки в них:

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
27.01.2020, 21:14

Удалите все файлы кроме 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
27.01.2020, 21:14

Хорошо из ответов выше, принимая подобное условие упаковывают имена файлов, не содержат новые строки в них:

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

Это сделало бы.

1
27.01.2020, 21:14

Теги

Похожие вопросы