Как удалить все файлы, которые были недавно созданы в каталоге в Linux? - PullRequest
5 голосов
/ 01 октября 2011

Я закопал что-то в каталог, который уже содержал много вещей. Вместо этого я хотел распаковать в отдельный каталог. Сейчас слишком много файлов, чтобы различать. Однако файлы, которые я разархивировал, были созданы только сейчас (верно?), И исходные файлы не изменялись долго (по крайней мере, один день). Есть ли способ удалить только эти необработанные файлы, основываясь на информации об их создании?

Ответы [ 4 ]

7 голосов
/ 01 октября 2011

Tar обычно восстанавливает временные метки файлов, поэтому фильтрация по времени вряд ли сработает.

Если у вас все еще есть tar-файл, вы можете использовать его для удаления распакованного с чем-то вроде:

tar tf file.tar --quoting-style=shell-always |xargs rm -i

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

Вы можете удалить каталоги, добавив -rк этому, но, вероятно, безопаснее просто удалить каталоги верхнего уровня вручную.

3 голосов
/ 01 октября 2011

найти.-mtime -1 -тип f |xargs rm

, но сначала проверьте с

find.-mtime -1 -тип f |xargs echo

1 голос
/ 01 октября 2011

Существует несколько разных ответов на этот вопрос в порядке возрастания сложности.

Во-первых, если это один раз, и в данном конкретном случае вы абсолютно уверены, что в ваших именах файлов нет странных символов(пробелы в порядке, но не символы табуляции, перевода строки и других управляющих символов, а также символы Юникода) это будет работать:

tar -tf file.tar | egrep '^(\./)?[^/]+(/)?$' | egrep -v '^\./$' | tr '\n' '\0' | xargs -0 rm -r

Все, что например, например, пропустить во всех подкаталогах подкаталогов.

Еще один способ сделать это, работающий с прикольными именами файлов, заключается в следующем:

mkdir foodir
cd foodir
tar -xf ../file.tar
for file in *; do rm -rf ../"$file"; done

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

. Чтобы этот метод работал с файлами, которые начинаются с ., сделайте следующее:

mkdir foodir
cd foodir
tar -xf ../file.tar
find . -mindepth 1 -maxdepth 1 -print0 | xargs -0 sh -c 'for file in "$@"; do rm -rf ../"$file"; done' junk

Наконец, принимаяиз ответа Мата , вы можете сделать это, и оно будет работать для любого имени файла и не потребовать от вас повторного распаковывания каталога:

tar -tf file.tar | egrep '^(\./)?[^/]+(/)?$' | grep -v '^\./$' | tr '\n' '\0' | xargs -0 bash -c 'for fname in "$@"; do fname="$(echo -ne "$fname")"; echo -n "$fname"; echo -ne "\0"; done' junk | xargs -0 rm -r
0 голосов
/ 04 мая 2014

Вы можете обрабатывать файлы и каталоги за один проход с помощью:

tar  -tf ../test/bob.tar --quoting-style=shell-always | sed -e "s/^\(.*\/\)'$/rmdir \1'/; t; s/^\(.*\)$/rm \1/;" | sort | bash

Вы можете видеть, что должно произойти, оставив канал «bash»

tar  -tf ../test/bob.tar --quoting-style=shell-always | sed -e "s/^\(.*\/\)'$/rmdir \1'/; t; s/^\(.*\)$/rm \1/;" | sort

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

...