самый старый или самый новый файл в дереве каталогов и удаление каждого файла в интерактивном режиме

451
Schultz Hartmut

На шаге 1 я пытаюсь найти самый старый файл в дереве каталогов, который я решил, следуя этому вопросу .

Теперь я хочу использовать xargsдля интерактивного удаления из самых старых в новейшие.

Так как это find -type f -printf '%T+ %p\n' | sort | xargs -0 -d '\n' rm -iне работает. Я видел в другом посте, find . -type f -print0 | xargs -0 ls -rtно добавление xargsк нему не работает, к сожалению.

pi@raspberrypi:/usr/share/doc/samba$ find . -type f -print0 | xargs -0 ls -rt | xargs -0 -d '\n' rm -i rm: remove write-protected regular file ‘./examples/LDAP/samba.schema.oc.IBM-DS’? rm: remove write-protected regular file ‘./examples/LDAP/samba-schema-netscapeds5.x.README’? rm: remove write-protected regular file ‘./examples/LDAP/samba-schema.IBMSecureWay’? rm: remove write-protected regular file ‘./examples/LDAP/samba.schema.gz’? rm: remove write-protected regular file ‘./examples/LDAP/samba-schema-FDS.ldif.gz’? rm: remove write-protected regular file ‘./examples/LDAP/samba.schema.at.IBM-DS.gz’? rm: remove write-protected regular file ‘./examples/LDAP/samba-nds.schema.gz’? rm: remove write-protected regular file ‘./examples/LDAP/samba.ldif.gz’? rm: remove write-protected regular file ‘./examples/LDAP/ol-schema-migrate.pl.gz’? rm: remove write-protected regular file ‘./examples/LDAP/get_next_oid’? rm: remove write-protected regular file ‘./README.Debian’? rm: remove write-protected regular file ‘./TODO.Debian’? rm: remove write-protected regular file ‘./NEWS.Debian.gz’? rm: remove write-protected regular file ‘./copyright’? rm: remove write-protected regular file ‘./changelog.Debian.gz’? rm: remove write-protected regular file ‘./examples/LDAP/README’? 

Обратите внимание, что это не проблема с разрешениями. Я использовал /usr/share/doc/sambaв качестве примера, чтобы избежать публикации моих реальных имен файлов.

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

#!/bin/bash find -type f -printf '%T+ %p\n' | sort | head -n 3 > /tmp/1 cut -c32- /tmp/1 | awk ''/tmp/2 bash /tmp/2 
0

2 ответа на вопрос

0
jhscheer

Вы были почти там.

Это делает то, что вы хотите, и обрабатывает пробелы в именах файлов:

find -type f -printf '%T+ %p\n' | sort | cut -c32- | xargs -p -n1 -d '\n' rm

-p, --interactive: Подскажите пользователю, нужно ли запускать каждую командную строку и читать строку из терминала. Запускайте командную строку, только если ответ начинается с y или Y.

-n max-args, --max-args=max-args: Используйте не более max-args аргументов в командной строке.

-d delim Элементы ввода завершаются указанным символом.

0
Ljm Dullaart

Единственные проблемные символы, которые я вижу в вашем скрипте - это "и новая строка. Вы не должны слишком беспокоиться о новой строке в имени файла.

Возможно, вы захотите использовать разные временные имена файлов, например, с $$именем в имени файла.

Итак, как улучшение:

#!/bin/bash TMP1=/tmp/file1.$$ TMP2=/tmp/file2.$$ find -type f -printf '%T+ %p\n' | sort | head -n 3 > $TMP1 cat $TMP1 | sed 's/"/\\"/g;s/[^ ]* //;s/^/rm -i "/;s/$/\"/' >$TMP2 bash $TMP2 rm -f $TMP1 $TMP2 

Это должно обрабатывать кавычки в вашем имени файла. (примечание: все еще есть некоторые проблемы со сценарием. Хотя это нормально делать в вашей домашней среде. И TMP в столицах не рекомендуется, но я все равно это делаю.)

Примечание: xargs -pне будет работать, если у вас есть имена файлов с пробелами.

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