У меня есть имена папок в указанном ниже формате даты

20130801
20130802
20130803
20130804
20130805
20130806
20130807
20130808
.
.
.
20130819

Точно так же у меня есть папки, созданные за последние два года для каждого дня, и в каждой из этих папок есть несколько файлов.

Я пытаюсь найти команду unix, которая будет искать папки, созданные по субботам и воскресеньям, и удалять все содержимое в папке и саму папку.

Например, в даты, которые я упомянул выше, папки с именами 20130803 и 20130804 и содержимое внутри них должны быть удалены.

2 ответа2

0

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

find . -path "./2013*" -printf "%f\n" | \
awk '{ \
cmd = sprintf( "date -d %s +\"%a\"", $0 ); \
cmd | getline value; close( cmd ); \
if( value ~ /Sat/ || value ~ /Sun/ ) print $0; \
}'

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

Это выведет имена каталогов, которые соответствуют "Sat" или "Sun" (зависит от локали) из результатов поиска. Вы можете использовать выходные данные для создания сценария для «rm -r» каталогов.

Вы также можете напрямую использовать формат даты find "% Aa" (который поддерживается тем же самым синтаксическим анализом формата strftime, что и дата), если вы знаете, что все даты обновления каталогов соответствуют их именам. Я предположил, что это не так (потому что это не для моего теста).

Например, с каталогами, которые я сделал для тестирования:

find . -path "./2013*" -printf "%Aa\n"

доходность

Tue
Tue
Tue

что не так полезно.

0

Вы можете создать скрипт bash (a.bash) для этого:

#!/bin/bash

for i in $(\ls -1d 2013*); 
  do 
     if [ $(date -d "$i" +%a) == "Sun" ] || [ $(date -d "$i" +%a) == "Sat" ]; then 
          echo "$i is weekend. Delete the content";
          rm -rf "$i"/*; 
     fi; 
done

выполнить ./a.bash

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