Intereting Posts
Как обнаружить, найти и установить отсутствующую прошивку packet_write_wait Разбитая труба, даже выходящая сверху? mod_rewrite: undefined symbol: lstat error Удаление или обновление программ, установленных в / usr / local Как рабочий стол Linux выполняет действия системы? Как я могу постоянно сообщать OpenSUSE об обновлении часового / текущего времени? Как я могу найти все файлы, чье имя начинается с «tty» в каталоге / dev со всей информацией о файлах? Grub не смог найти файл / boot / grub / stage1, когда я пытаюсь сделать резервную копию linux на компактной флеш-карте Окончание баша для значений, разделенных запятыми Как я могу подсчитать количество повторений последовательности байтов в файле? Почему по умолчанию на CentOS отключен интерфейс eth0 по умолчанию? Ядро: EDAC MC0: UE страница 0x0 указывает на плохую память, драйвер или что-то еще? Как проверить из командной строки, что доступная сеть? Отсутствие записей из файла сообщений Как исправить ошибку в grub.cfg из LiveCD?

Удалите все файлы в папке, кроме последней (последней) 20

Я хочу удалить все файлы из разных каталогов и хочу сохранить только последние файлы 20 файлов. это правильная команда для этого?

ls -t1 /mnt/dwh/ftp/dwh_ftp_cbs/ARLOGS/ | tail -n +22 | xargs rm -f 

В вашей команде есть много недостатков, например обработка вывода ls , это своего рода катехизис. См. Эту статью, почему бы не сделать это.

Этот подход не использует расширения GNU и проверяется на bash, zsh, ksh93, тире и золе:

 for f in * .*; do [ -f "$f" ] && printf "%s " $(perl -e 'print((stat("$ARGV[0]"))[9])' -- "$f") && \ printf "%s\0" "$f"; done | tr '\0\n' '\n\0' | sort -k1nr | \ sed "1,20d;s/'/'\"'\"'/g;s/[^ ]* \(.*\)/rm -f -- '\1';/" | tr '\0' '\n' | sh 

Это самое странное имя файла, которое я смог произвести, он работает даже с этим:

 touch -- '--a'"'"'b"c d$e\nf\r!g;h^i`j(k)l*m%n=o?p.txt' 

Или имя файла, которое пытается «выпрыгнуть»:

 touch '\'"'"'echo test '"'"'\' 
 ls -t1 /mnt/dwh/ftp/dwh_ftp_cbs/ARLOGS/ | tail -n +22 | xargs rm -f 

Не будет работать, потому что вывод ls будет включать имена файлов, а не их полный путь. Он также пропустит файлы, имя которых начинается с . ,

 cd /mnt/dwh/ftp/dwh && ls -At1 | tail -n +21 | xargs rm -f -- 

разрешит это, но у вас все еще будут проблемы с именами файлов, которые содержат пробелы или символы новой строки или апострофы или обратной косой черты или двойные кавычки (и, возможно, имена файлов с байтами, которые не образуют действительных символов в локали).

 (export LC_ALL=C cd /mnt/dwh/ftp/dwh && ls -At1 | tail -n +21 | sed 's/"/\\"/g;s/.*/"&"/' | xargs rm -f -- ) 

исправить большинство из них, но у вас все еще будет проблема с именами файлов, содержащими символы новой строки. Проблема в том, что вывод ls -At1 не обрабатывается после обработки.

Вывод ls -Atd1 ./.* ./* может быть обработан после обработки (поскольку эти ./ префиксы указывают, где каждое имя файла начинается с вывода, но не легко), но вы рискуете достигнуть предела по числу аргументов, переданных команде, передавая список имен файлов таким образом.

Лучше всего было бы использовать оболочку, которая может выполнять эту сортировку в своих глоссах , или полагаться на расширения GNU, если вам нужно работать только с GNU-системами:

  cd /mnt/dwh/ftp/dwh && find . ! -name . -prune ! -type d -printf '%T@\t%p\0' | tr '\0\n' '\n\0' | sort -rn | tail -n +21 | cut -f 2- | tr '\0\n' '\n\0' | xargs -r0 rm -f 

Здесь мы исключаем файл типа directory , который будет влиять на нумерацию, но, вероятно, ближе к тому, что вы хотите, поскольку я не предполагаю, что вы хотите удалить каталоги. Если вы хотите удалить каталоги, удалите -type d и добавьте параметр -r в rm .

Или:

 eval "set -- $(COLUMNS=4294967295 ls -Atx --quoting-style=shell-always)" if [ "$#" -gt 20 ]; then shift 20 printf '%s\0' "$@" | xargs -r0 rm -f -- fi 

Или используйте общий язык программирования, такой как perl , python , ruby