2014-04-04 5 views
0

Я новичок в сценарии оболочки. Не могли бы вы предложить мне некоторый код для следующего требования?Сохраните последние 3 папки и удалите остальные в сценарии bash?

У меня после отформатированных папок

пример: /home/backup/store_id/datewisefolder/some.zip

как: /home/backup/44/22032014/some_file.zip

/home/backup/44/23032014/some_file.zip 

    /home/backup/44/24032014/some_file.zip 

    /home/backup/44/25032014/some_file.zip 

еще много ..

Я хочу перейти к каждому каталогу идентификаторов магазина & сохранить только последние 3 даты мудрая папка остальная часть удалена. Здесь 44 хранят идентификационную папку 23032014,24032014,25032014, эти три являются последними, поэтому сохраняйте их. 22032014 старше, поэтому удалите его.

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

ниже коды узнать наиболее позднюю дату папки Мудрых

кд/дома/резервное копирование/44/ Ls -1 | sort -n -k1.8 -k1.4 -k 1 | tail -3

+0

Вы можете удалить файлы старше n, например 'find -mtime +3 -delete' удаляет файлы старше 3 дней. –

+0

Я не хочу на основе времени – Rups

+0

Возможный дубликат [Удалить все, кроме самых последних файлов X в bash] (http://stackoverflow.com/questions/25785/delete-all-but-the-most-recent-x -files-in-bash) – dogbane

ответ

0

Ниже сценарий может работать.

declare -a axe 
axe=`ls -l /home/backup/* | sort -n -k1.8 -k1.4 -k 1|head -n -3` 

for i in $axe 
do 
    rm -rf $i; 
done 
+0

44 store_id не постоянная папка, у нее есть еще много хранилища, например, 45,46,47,87,98..so на – Rups

+0

Отредактировано код. Пожалуйста, проверьте. – vishram0709

0

находка является распространенным инструментом для такого рода задачи:

find ./my_dir -mtime +3 -delete 

explaination: 

./my_dir your directory (replace with your own) 
-mtime +3 older than 3 days 
-delete delete it. 

Или согласно кода сценария

files=(`ls -1 /my_dir | sort -n -k1.8 -k1.4 -k 1 | tail -3`) 

for i in *; do 
keep=0; 
#Check whether this file is in files array: 
for a in ${files[@]}; do 
    if [ $i == $a ]; then 
    keep=1; 
    fi; 
done; 
# If it wasn't, delete it 
if [ $keep == 0 ]; then 
    rm -rf $i; 
fi; 
done 
+0

У меня нет постоянной папки/my_dir. это как/home/backup/44,43,56,77, ---- поэтому в эту мудрую папку в эту дату мне нужно повернуть папки. – Rups

+0

@ user2481010 Итак, используйте первое решение, указав путь во всех ваших файлах, например '/ home/backup/44,43,56,77,'. –

+0

Также вы используете команду «find/home/backup -type d' вместо' ls' во второй команде решения для выполнения вашей работы. –

0
ls /home/backup | while read store_id 
do 
    count=0 
    ls -t /home/backup/$store_id | while read dir_to_remove 
    do 
    count=$((count + 1)) 
    if [ $count -gt 3 ]; then 
     rm -rf /home/backup/$store_id/$dir_to_remove 
    fi 
    done 
done 
0

кд в каждой директории store_id в свою очередь. Создайте список каталогов с восьмизначными именами, отсортированными в обратном порядке (самые последние первые); наконец, перечислим часть списка, опуская первые $ keep элементы, на rm.

basedir=/home/backup 
# How many directories to keep: 
retain=3 

shopt -s nullglob 

# Assuming that anything beginning with a digit is a store_id directory. 
for workdir in "$basedir"/[0-9]*/ ; do 
    (
    cd "$workdir" || exit 1 
    # Create the list. The nullglob option ensures that if there are no 
    # suitable directories, rmlist will be empty. 
    rmlist=(
     $(
      printf '%s\n' [0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]/ | 
      sort -nr -k1.5,1.8 -k1.3,1.4 -k1.1,1.2 
     ) 
    ) 
    # If there are fewer than $retain entries in ${rmlist[@]}, rm will be 
    # given no names and so do nothing. 
    rm -rf -- "${rmlist[@]:$retain}" 
) 
done 
Смежные вопросы