sed 's_\(/.*/.*\)/.*_\1_' your-file.txt
Это - пример:
>sed 's_\(/.*/.*\)/.*_\1_' your-file.txt
/tutordashboard/manageTutorLogInStatus
/tutordashboard/manageTutorLogInStatus
С 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
)
Принимающие имена файлов не содержат символы новой строки:
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
Удалите все файлы кроме 5 новейших:
find -type f -printf '%T@ %P\n' | sort -n | cut -d' ' -f2- | head -n -5 | xargs rm
Можно легко адаптировать его для позже копирования/перемещения файлов где-то в другом месте.
Хорошо из ответов выше, принимая подобное условие упаковывают имена файлов, не содержат новые строки в них:
ls -t | head -n5 | xargs -I{} mv {} $destination_dir
Это сделало бы.