
На шаге 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 '{print "rm -i", "\""$_"\""}'/tmp/2
bash /tmp/2
решение1
Единственные проблемные символы, которые я вижу в вашем скрипте, это "
и новая строка. Вам не стоит слишком беспокоиться о новой строке в имени файла.
Возможно, вы захотите использовать другие временные имена файлов, например, с символом . $$
в имени файла.
Итак, в качестве улучшения:
#!/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
не будет работать, если в именах файлов есть пробелы.
решение2
Вы почти у цели.
Это делает то, что вам нужно, и обрабатывает пробелы в именах файлов:
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
Элементы ввода завершаются указанным символом.