как удалить все файлы, кроме последних трех в папке - PullRequest
9 голосов
/ 15 декабря 2010

У меня есть папка, которая содержит некоторые проверки версий Subversion (они проверяются при запуске рецепта развертывания Capistrano).

что я действительно хочу сделать, так это сохранить последние 3 ревизии, которые проверяет скрипт capistrano, и удалить другие, поэтому для этого я планирую выполнить некоторую команду на терминале с помощью команды run, фактически capistranoздесь нечего делать, кроме команды unix.

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

(ls -t /var/path/to/folder |head -n 3; ls /var/path/to/folder)|sort|uniq -u|xargs

сейчасесли я добавлю rm -Rf в конец этой команды, она вернет меня с файлом, который не найден для удаления.так что это очевидно, потому что это возвращает только имя папки, а не полный путь к папке.

есть ли способ удалить эти файлы / папки с помощью одной команды unix?

Ответы [ 3 ]

16 голосов
/ 15 декабря 2010

Хорошо, в вашем скрипте есть несколько ошибок.

Первая и самая проблемная строка:

ls -t /var/path/to/folder |head -n 3;

ls -t вернет список файлов впорядок их последнего изменения, начиная с последнего изменения .head -n 3 говорит, что нужно перечислить только первые три строки.Так что это говорит о том, что «дайте мне список только трех самых последних измененных файлов», что я не думаю, что вы хотите.

Я не совсем уверен, что вы делаете со второй командой ls, но я почти уверен, что это просто объединит все файлы в каталоге в ваш список.Это означает, что когда он получит sort ed и uniq 'ed, у вас останется алфавитный список всех файлов в этом каталоге.Когда передается что-то вроде xargs rm, вы уничтожаете все в этом каталоге.

Далее, sort | uniq не нужна часть uniq.Вы можете просто использовать переключатель -u на sort, чтобы избавиться от дубликатов.В любом случае эта часть вам не нужна.

Наконец, фактическое удаление каталога.С этой стороны, вы правильно поняли свой вопрос: просто используйте rm -r

Вот самый простой способ, которым я могу подумать сделать это:

ls -t1 /var/path/to/folder | tail -n +4 | xargs rm -r

Вот что здесь происходит:

  • ls -t1 печатает список, один файл / каталог на строку, всех файлов в /var/path/to/folder, упорядочивая по самой последней дате изменения.
  • tail -n +4 печатает все строки в выводе ls -t1, начиная с четвертой строки (т. Е. Три последних измененных файла не будут перечислены)
  • xargs rm -r говорит об удалении любого файла, выводимого изtail.-r означает рекурсивное удаление файлов, поэтому, если он обнаружит каталог, он удалит все в этом каталоге, а затем удалит сам каталог.

Обратите внимание, что я ничего не сортирую и не удаляюлюбые дубликаты.Это потому что:

  • ls сообщает о файле только один раз, поэтому нет дубликатов для удаления
  • Вы удаляете все переданные файлы, так что это не имеет значения вв каком порядке они удалены.

Имеет ли все это смысл?

Редактировать:

Так как я ошибся в ls, указав полный путь, когдапередал абсолютный каталог, и, поскольку вы не сможете выполнить cd, возможно, вы могли бы использовать tail.

Например:

 ls -t1 /var/path/to/folder | tail -n +4 | xargs find /var/path/to/folder -name $1 | xargs rm -r
4 голосов
/ 16 февраля 2014

Ниже приведен полезный способ выполнения задачи ....... !!

для Linux и HP-UX:

ls -t1 | хвост -n +50 | xargs rm -r # оставить последние 50 файлов / каталогов.

для SunOS:

rm `(ls -t | head -n 100; ls) | sort | uniq -u`

0 голосов
/ 17 декабря 2010

Привет, я нашел способ сделать это, мы можем использовать Unix &&

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

cd /var/path/to/folder && ls -t1 /var/path/to/folder | tail -n +4 | xargs rm -r
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...