Никогда не рекомендуется использовать вывод ls
для чего-либо, кроме просмотра в терминале. См. Почему не разборls
(и что делать вместо )? . Вместо этого используйтеfind
:
find /home/balaji/work/ -type f -printf '%C@\t%p\0' |
sort -z -k1,1 -r -n |
cut -z -f2 |
head -z -n 10 |
xargs -0r echo mv -t /home/balaji/regular_archive/
Для этого требуются версии GNU find
, sort
, cut
, tail
иxargs
(или, по крайней мере, другие их версии, поддерживающие параметр -z
для разделителей записей NUL ). ].
find
использует -printf '%C@\t%p\0'
для перечисления последних -измененных меток времени (%C@
, в секундах с начала эпохи 1970 -01 -01 00 :00 :00 )и имен файлов(%p
)всех обычных файлов. Поля разделены одной вкладкой (\t
), а каждая запись разделена символом NUL (\0
)-r
)файлов численно(-n
)только по первому полю(-k 1,1
)--т. е. по метке времени. head
для получения первых десяти записей xargs
для выполнения команды mv
. При этом используется расширение GNU -t
для mv, так что целевой каталог может быть указан перед именами файлов. На самом деле, это работает echo mv
, а не mv
, так что это пробный -запуск. Избавьтесь от echo
, если вы уверены, что он будет делать то, что вам нужно.
Примечание :Это будет работать с любыми именами файлов, независимо от того, какие странные и раздражающие символы они могут содержать (, например. пробелы, новые строки, метасимволы оболочки и т. д. ). Кроме того, команда file
имеет много других опций, которые можно использовать для уточнения критериев поиска.
Если у вас старая версия GNU coreutils (, то есть cut, ни head
, ни tail
не будут иметь опции -z
. Вместо этого вы можете использовать awk
. например.
find /home/balaji/work/ -type f -printf '%C@\t%p\0' |
sort -z -k1,1 -r -n |
awk -F '\t' 'BEGIN {RS=ORS="\0"}; NR<=10 { $1=""; $0=$0; $1=$1 ; print }' |
xargs -0r echo mv -t /home/balaji/regular_archive/
В качестве альтернативы вы можете использовать perl
вместоawk
:
perl -F'\t' -0lane 'if ($. <= 10) {delete $F[0]; print @F}'