2016-05-10 2 views
0

У меня есть структура вроде этого:удалить файлы из вложенных папок без трех последних

/usr/local/a/1.txt 
/usr/local/a/2.txt 
/usr/local/a/3.txt 
/usr/local/b/4.txt 
/usr/local/b/3.txt 
/usr/local/c/1.txt 
/usr/local/c/7.txt 
/usr/local/c/6.txt 
/usr/local/c/12.txt 
... 

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

ls -tr *.txt | head -n-3 |xargs rm -f 

Мне нужно объединить, что с кодом:

find /usr/local/**/* -type f 

Должен ли я использовать параметр maxdepth?

Спасибо за помощь, Aola

+0

* наибольший модификация дата * средства? Последние файлы изменены? – heemayl

+0

Да, файлы, измененные последними – aola

+0

, посмотрите на это, он удалит определенные файлы в поддире http://superuser.com/questions/112078/delete-matching-files-in-all-subdirectories – piyushj

ответ

1

Добавлен maxdepth варианта, чтобы найти для одного уровня, сортировка файлов по времени последнего изменения, tail игнорировать старые измененные 3 файлы и xargs с -r, чтобы удалить файлы, только если они найденный.

for folder in $(find /usr/local/ -type d) 
do  
    find $folder -maxdepth 1 -type f -name "*.txt" | xargs -r ls -1tr | tail -n+3 | xargs -r rm -f 
done 

Выполните вышеупомянутую команду один раз без rm, чтобы гарантировать, что предыдущие команды выбрать нужные файлы для удаления.

+0

спасибо! Я использовал только головку с хвостом – aola

0

Вы почти получили решение: использовать find, чтобы получить файлы, ls отсортировать их по дате модификации и tail опустить три наиболее недавно модифицированные из них:

find /usr/lib -type f | xargs ls -t | tail -n +4 | xargs rm 

Если вы хотите удалить только файлы с заданной глубиной добавить -mindepth 4 -maxdepth 4, чтобы найти параметры.

+0

Это работает только в том случае, если все аргументы подходят к одному ls -t. – visit1985

0

Вы можете использовать опцию find -printf, чтобы печатать время модификации перед именем файла, а затем сортировать и убирать дату. Это позволяет избежать использования ls вообще.

find /usr/local -type f -name '*.txt' -printf '%[email protected]|%p\n' | sort -r | cut -d '|' -f 2 | head -n-3 | xargs rm -f 

Другие ответы с помощью xargs ls -t могут привести к неправильным результатам, когда есть больше результатов, чем xargs может поместить в одну ls -t команды.

0

но для каждой вложенной папки, поэтому, когда у меня есть

/usr/local/a/1.txt 
/usr/local/a/2.txt 
/usr/local/a/3.txt 
/usr/local/a/4.txt 
/usr/local/b/4.txt 
/usr/local/b/3.txt 
/usr/local/c/1.txt 
/usr/local/c/7.txt 
/usr/local/c/6.txt 
/usr/local/c/12.txt 

Я хочу использовать код для каждой вложенной отдельно

head -n-3 |xargs rm -f 

так Бьюсь, если он у меня сортируется по дате, то файлы для удаления:

/usr/local/a/4.txt 
/usr/local/c/12.txt 

Я хочу уйти в любом вложенных три новых файлах

+0

Ознакомьтесь с моим обновленным ответом, чтобы просмотреть все подпапки в каталоге '/ usr/local', чтобы удалить файлы – Inian