4

Иногда я буду делать такие команды, как

unzip tons_of_files.zip

И я забуду поставить -d, чтобы указать на подкаталог. Это приводит к тому, что текущая папка заполняется тоннами файлов, которые смешаны с существующими файлами.

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

4 ответа4

5

Быстрый способ может быть следующим:

unzip -qql tons_of_files.zip | while read -r l d t n ; do rm -fr "$n" ; done

Как это делает автоматическое стирание: используйте его на свой страх и риск. Для предварительного просмотра замените ... rm ... на ... echo rm ...

1

$ для меня в `unzip -qql ton_of_files.zip | tr -s "" | cut -d "" -f 5 | sed 's/^.*///' `; сделать эхо $ я; сделанный

Поменяйте echo на rm .

Что он делает (внутри тылы):

  1. список файлов (один на один)
  2. сжать пробелы
  3. выберите 5-е поле
  4. удалить все, что является именем папки
1

Если вы извлекли файлы в каталог, где вы не изменяли или не перемещали какие-либо файлы за несколько минут до извлечения, вы можете указать извлеченные файлы по их очень недавнему времени ctime. Это не идеально (если каталог содержит извлеченный файл, вы не можете сказать, был ли он создан путем распаковки или существовал раньше (возможно, пустой)), но на практике работает достаточно хорошо.

Следующая команда GNU find перемещает файлы и каталоги в текущем каталоге с ctime менее 2 минут назад в /other/dir . ls -lctr может помочь найти подходящее время отключения.

find . -mindepth 1 -maxdepth 1 -cmin -2 -exec mv {} /other/dir \;

Zsh эквивалент:

mv *(cm-3) /other/directory

Следующая команда GNU find перемещает файлы с таким же недавним временем ctime в дереве каталогов с корнем в текущем каталоге в аналогичный путь в /other/dir .

find . -mindepth 1 -cmin -2 -type f -exec sh -c '
    for x; do
      mkdir -p "$0/${x%/*}"
      mv "$x" "$0/$x"
    done
  ' /other/dir {} +

Эквивалент Zsh (почти: он воспроизводит всю иерархию каталогов, а не только каталоги, которые будут содержать файлы):

autoload zmv
mkdir -p ./**/*(/cm-3:s"|.|/other/dir|")
zmv -Q '(**/)(*)(.cm-3)' /other/dir/'$1$2'
0

Предполагая, что ваш текущий рабочий каталог - это папка, в которую вы случайно распаковали файл:

unzip -Z1 ../../accidentally-extracted.zip | xargs rm

Объяснение:

  1. unzip -Z1 перечисляет все файлы в zip-файле построчно
  2. xargs передает каждую строку в качестве аргумента для rm

Если вы не находитесь в папке, в которую вы случайно извлекли файлы, вы можете случайно удалить файлы, если они совпадают с одним из файлов в zip-архиве.

Если вы не уверены, вы можете запустить xargs с -p чтобы он подсказывал вам о каждом выполнении. Вы можете сделать первые пару казней, чтобы быть уверенным, что вы ничего не испортили.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .