BASH skript - Ba'zi va ularning pastki papkalari/fayllari bundan mustasno bo'lib X kundan katta bo'lgan papkalarni o'chirish

Men aslida bu skriptni sinab ko'rmoqdaman

find /Path/Folder/* -type d -mtime +7 ! -path "/Path/Folder/NODELETE1/*"  ! -path "/Path/Folder/NODELETE2/*"  ! -path "/Path/Folder/NODELETE3/*" -exec rm -rf {} \;

NODELETE1 , NODELETE2 va NODELETE3 papkasidan tashqari, 7 kundan eski barcha fayllarni/papkalarni o'chirish.

Muammo shundaki, u ishlamayapti, chunki bu papkalarni va barcha fayllarni o'chiradi.

Men shuni xohlayman:

menda bor

/Path/Folder/NODELETE1/some files and folders
/Path/Folder/NODELETE2/some files and folders
/Path/Folder/NODELETE3/some files and folders
/Path/Folder/AFOLDER/somefiles and folders
/Path/Folder/ANOTHERFOLDER/somefiles and folders
/Path/Folder/...
/Path/Folder/FILE
/Path/Folder/ANOTHERFILE
/Path/Folder/...

Avvalgi 7 kundan katta bo'lgan barcha fayl va papkalarni avtomatik tarzda o'chirib tashlamoqchiman (shuning uchun FOLDER , ANOTHERFOLDER , ... ) FILE < kodi, ANOTHERFILE , ... )

/Path/Folder/NODELETE1/some files and folders
/Path/Folder/NODELETE2/some files and folders
/Path/Folder/NODELETE3/some files and folders

Buyruq faylida nima bor?

Skript taklifi bilan EDIT:

#!/bin/bash

while IFS= read -r -d '' dir
do

    # This line actually halts the control from entering if 
    # dirname contains either of the three names below. You could
    # remove it and put your actual folder names.

    [[ $dir =~ ^(NODELETE1|NODELETE2|NODELETE3)$ ]] && continue

    # Suggest un-commenting the echo line below and comment rm to ensure
    # you have only the folders you want to delete. 
    echo "$dir"

    # rm -rf "$dir"     
done< <(find /Users/Username/Desktop/test/* -type d -mtime +7 -print0)

For testing, menda bor:

/Users/Username/Desktop/test/NODELETE1
/Users/Username/Desktop/test/NODELETE2
/Users/Username/Desktop/test/NODELETE3
/Users/Username/Desktop/test/YESDELETE

va skript yo'li

/Users/Username/Desktop/TEST.sh
2
Faqat men paranoyadan aziyat chekib, rm -rf kodini to'g'ridan-to'g'ri find -exec argumenti deb hech qachon bajarmaslik kerakmi? :)
qo'shib qo'ydi muallif jm666, manba
Faqat men paranoyadan aziyat chekib, rm -rf kodini to'g'ridan-to'g'ri find -exec argumenti deb hech qachon bajarmaslik kerakmi? :)
qo'shib qo'ydi muallif jm666, manba
Faqat men paranoyadan aziyat chekib, rm -rf kodini to'g'ridan-to'g'ri find -exec argumenti deb hech qachon bajarmaslik kerakmi? :)
qo'shib qo'ydi muallif jm666, manba
o'rniga -not-path "/ Path/Folder/NODELETE1/*" ni sinab ko'rsangiz bo'ladi! "yo'l"/Path/Folder/NODELETE1/* "
qo'shib qo'ydi muallif Inian, manba
o'rniga -not-path "/ Path/Folder/NODELETE1/*" ni sinab ko'rsangiz bo'ladi! "yo'l"/Path/Folder/NODELETE1/* "
qo'shib qo'ydi muallif Inian, manba
@ jm666: Aynan shu erda nima uchun nomni tekshirishga ega bo'lgan muqobil taklif qilingan
qo'shib qo'ydi muallif Inian, manba
o'rniga -not-path "/ Path/Folder/NODELETE1/*" ni sinab ko'rsangiz bo'ladi! "yo'l"/Path/Folder/NODELETE1/* "
qo'shib qo'ydi muallif Inian, manba
@ jm666: Aynan shu erda nima uchun nomni tekshirishga ega bo'lgan muqobil taklif qilingan
qo'shib qo'ydi muallif Inian, manba
@ jm666: Aynan shu erda nima uchun nomni tekshirishga ega bo'lgan muqobil taklif qilingan
qo'shib qo'ydi muallif Inian, manba

8 javoblar

find buyrug'ining asosiy utilslariga suyanishning o'rniga, bash ni saqlashga ruxsat berishni tavsiya qilaman (baribir bash tagiga egasiz) ma'lum nomlarga ega bo'lgan papkalarni chiqarib tashlash,

#!/bin/bash

while IFS= read -r -d '' dir
do

    # This line actually halts the control from entering if 
    # dirname contains either of the three names below. You could
    # remove it and put your actual folder names.

    [[ $dir =~ ^(NODELETE1|NODELETE2|NODELETE3)$ ]] && continue

    # Suggest un-commenting the echo line below and comment rm to ensure
    # you have only the folders you want to delete. 
    # echo "$dir"

    rm -rf "$dir"     
done< <(find /Path/Folder/* -type d -mtime +7 -print0)
2
qo'shib qo'ydi
@DylanDog: bash versiyasidan foydalanayotganini ko'rsangiz, bash - versiya ni bajarishingiz mumkinmi ?, shuningdek qanday bash ni ko'rsating va ko'rsatilgan yo'lni kiriting bash uchun #!
qo'shib qo'ydi muallif Inian, manba
@DylanDog: Men uchun juda yaxshi ishlaydi! Windows-ning mashinadan joylashtirilgan narsalarni nusxa olasizmi?
qo'shib qo'ydi muallif Inian, manba
@DylanDog: Shuningdek, savolga to'liq skript yozish mumkinmi? shu jumladan, mening fikrimcha, muammoga ishora qilish oson bo'ladi
qo'shib qo'ydi muallif Inian, manba
@DylanDog: Mening yangilanishim bilan ishlay olasizmi, || o'rniga && bilan almashtirildi, bundan oldin xatolik yuz berdi!
qo'shib qo'ydi muallif Inian, manba
@DylanDog: Besh tarjimonlari bilan ishlayapsizmi? #!/bin/bash buyruq faylining ustki qismida?
qo'shib qo'ydi muallif Inian, manba
@DylanDog: Yordam berishdan baxtiyorman, nima uchun aynan siz uchun ishlamayotganini bilmayman.
qo'shib qo'ydi muallif Inian, manba
va ha yo'ldan/bin/bash
qo'shib qo'ydi muallif DylanDog, manba
Men noto'g'ri qilayotganimni tekshirib ko'raman va bu erda xato haqida xabar beraman. Agar eng ko'p javob beradigan bo'lsam, birdaniga ko'proq javob beradigan bo'lsam, uni ixtiyoriy ravishda bajaraman. Sizning javobingiz, albatta, eng yaxshi echimdir, ammo hozir men ushbu savolga javob sifatida quyidagi belgini qo'ydim. Sizning yordamingiz uchun juda minnatdorman!
qo'shib qo'ydi muallif DylanDog, manba
GNU bash versiyasi 3.2.57 (1) -release (x86_64-apple-darwin15)
qo'shib qo'ydi muallif DylanDog, manba
makos yo'q, lekin UNIX serverida foydalanaman
qo'shib qo'ydi muallif DylanDog, manba
bajarildi, lekin bir xil xato
qo'shib qo'ydi muallif DylanDog, manba
Ha #!/bin/bash
qo'shib qo'ydi muallif DylanDog, manba
LINE 17: kutilmagan belgi yaqinidagi sintaksik xato /Users/Username/Desktop/TEST.sh: layn 17: bajarildi < (top/Foydalanuvchilar/Login/Desktop/test/* -type d -mtime +7 -print0) '
qo'shib qo'ydi muallif DylanDog, manba

find buyrug'ining asosiy utilslariga suyanishning o'rniga, bash ni saqlashga ruxsat berishni tavsiya qilaman (baribir bash tagiga egasiz) ma'lum nomlarga ega bo'lgan papkalarni chiqarib tashlash,

#!/bin/bash

while IFS= read -r -d '' dir
do

    # This line actually halts the control from entering if 
    # dirname contains either of the three names below. You could
    # remove it and put your actual folder names.

    [[ $dir =~ ^(NODELETE1|NODELETE2|NODELETE3)$ ]] && continue

    # Suggest un-commenting the echo line below and comment rm to ensure
    # you have only the folders you want to delete. 
    # echo "$dir"

    rm -rf "$dir"     
done< <(find /Path/Folder/* -type d -mtime +7 -print0)
2
qo'shib qo'ydi
@DylanDog: bash versiyasidan foydalanayotganini ko'rsangiz, bash - versiya ni bajarishingiz mumkinmi ?, shuningdek qanday bash ni ko'rsating va ko'rsatilgan yo'lni kiriting bash uchun #!
qo'shib qo'ydi muallif Inian, manba
@DylanDog: Men uchun juda yaxshi ishlaydi! Windows-ning mashinadan joylashtirilgan narsalarni nusxa olasizmi?
qo'shib qo'ydi muallif Inian, manba
@DylanDog: Shuningdek, savolga to'liq skript yozish mumkinmi? shu jumladan, mening fikrimcha, muammoga ishora qilish oson bo'ladi
qo'shib qo'ydi muallif Inian, manba
@DylanDog: Mening yangilanishim bilan ishlay olasizmi, || o'rniga && bilan almashtirildi, bundan oldin xatolik yuz berdi!
qo'shib qo'ydi muallif Inian, manba
@DylanDog: Yordam berishdan baxtiyorman, nima uchun aynan siz uchun ishlamayotganini bilmayman.
qo'shib qo'ydi muallif Inian, manba
@DylanDog: Besh tarjimonlari bilan ishlayapsizmi? #!/bin/bash buyruq faylining ustki qismida?
qo'shib qo'ydi muallif Inian, manba
GNU bash versiyasi 3.2.57 (1) -release (x86_64-apple-darwin15)
qo'shib qo'ydi muallif DylanDog, manba
va ha yo'ldan/bin/bash
qo'shib qo'ydi muallif DylanDog, manba
Men noto'g'ri qilayotganimni tekshirib ko'raman va bu erda xato haqida xabar beraman. Agar eng ko'p javob beradigan bo'lsam, birdaniga ko'proq javob beradigan bo'lsam, uni ixtiyoriy ravishda bajaraman. Sizning javobingiz, albatta, eng yaxshi echimdir, ammo hozir men ushbu savolga javob sifatida quyidagi belgini qo'ydim. Sizning yordamingiz uchun juda minnatdorman!
qo'shib qo'ydi muallif DylanDog, manba
makos yo'q, lekin UNIX serverida foydalanaman
qo'shib qo'ydi muallif DylanDog, manba
bajarildi, lekin bir xil xato
qo'shib qo'ydi muallif DylanDog, manba
Ha #!/bin/bash
qo'shib qo'ydi muallif DylanDog, manba
LINE 17: kutilmagan belgi yaqinidagi sintaksik xato /Users/Username/Desktop/TEST.sh: layn 17: bajarildi < (top/Foydalanuvchilar/Login/Desktop/test/* -type d -mtime +7 -print0) '
qo'shib qo'ydi muallif DylanDog, manba

find buyrug'ining asosiy utilslariga suyanishning o'rniga, bash ni saqlashga ruxsat berishni tavsiya qilaman (baribir bash tagiga egasiz) ma'lum nomlarga ega bo'lgan papkalarni chiqarib tashlash,

#!/bin/bash

while IFS= read -r -d '' dir
do

    # This line actually halts the control from entering if 
    # dirname contains either of the three names below. You could
    # remove it and put your actual folder names.

    [[ $dir =~ ^(NODELETE1|NODELETE2|NODELETE3)$ ]] && continue

    # Suggest un-commenting the echo line below and comment rm to ensure
    # you have only the folders you want to delete. 
    # echo "$dir"

    rm -rf "$dir"     
done< <(find /Path/Folder/* -type d -mtime +7 -print0)
2
qo'shib qo'ydi
@DylanDog: bash versiyasidan foydalanayotganini ko'rsangiz, bash - versiya ni bajarishingiz mumkinmi ?, shuningdek qanday bash ni ko'rsating va ko'rsatilgan yo'lni kiriting bash uchun #!
qo'shib qo'ydi muallif Inian, manba
@DylanDog: Men uchun juda yaxshi ishlaydi! Windows-ning mashinadan joylashtirilgan narsalarni nusxa olasizmi?
qo'shib qo'ydi muallif Inian, manba
@DylanDog: Shuningdek, savolga to'liq skript yozish mumkinmi? shu jumladan, mening fikrimcha, muammoga ishora qilish oson bo'ladi
qo'shib qo'ydi muallif Inian, manba
@DylanDog: Mening yangilanishim bilan ishlay olasizmi, || o'rniga && bilan almashtirildi, bundan oldin xatolik yuz berdi!
qo'shib qo'ydi muallif Inian, manba
@DylanDog: Besh tarjimonlari bilan ishlayapsizmi? #!/bin/bash buyruq faylining ustki qismida?
qo'shib qo'ydi muallif Inian, manba
@DylanDog: Yordam berishdan baxtiyorman, nima uchun aynan siz uchun ishlamayotganini bilmayman.
qo'shib qo'ydi muallif Inian, manba
va ha yo'ldan/bin/bash
qo'shib qo'ydi muallif DylanDog, manba
GNU bash versiyasi 3.2.57 (1) -release (x86_64-apple-darwin15)
qo'shib qo'ydi muallif DylanDog, manba
Men noto'g'ri qilayotganimni tekshirib ko'raman va bu erda xato haqida xabar beraman. Agar eng ko'p javob beradigan bo'lsam, birdaniga ko'proq javob beradigan bo'lsam, uni ixtiyoriy ravishda bajaraman. Sizning javobingiz, albatta, eng yaxshi echimdir, ammo hozir men ushbu savolga javob sifatida quyidagi belgini qo'ydim. Sizning yordamingiz uchun juda minnatdorman!
qo'shib qo'ydi muallif DylanDog, manba
makos yo'q, lekin UNIX serverida foydalanaman
qo'shib qo'ydi muallif DylanDog, manba
bajarildi, lekin bir xil xato
qo'shib qo'ydi muallif DylanDog, manba
Ha #!/bin/bash
qo'shib qo'ydi muallif DylanDog, manba
LINE 17: kutilmagan belgi yaqinidagi sintaksik xato /Users/Username/Desktop/TEST.sh: layn 17: bajarildi < (top/Foydalanuvchilar/Login/Desktop/test/* -type d -mtime +7 -print0) '
qo'shib qo'ydi muallif DylanDog, manba

DR; doktor Fix:

Sizning chizig'ingiz o'rniga:

find /Path/Folder/* -type d -mtime +7 ! -path "/Path/Folder/NODELETE1"  ! -path "/Path/Folder/NODELETE2"  ! -path "/Path/Folder/NODELETE3" -exec rm -rf {} \;

Uzunroq tushuntirish:

Chizig'ingizning -type d qismi faqatgina kataloglarni qidiradi. Lekin, siz istisno qiladigan narsalar sizning NODELETE katalogingizdagi narsalar. Bu sizning NODELETE kataloglaringiz rm -rf uchun mo'ljallangan maqsadlar bo'lib, ular o'z-o'zidan o'chiriladi.

2
qo'shib qo'ydi
Bu juda yaxshi ishlaydi!
qo'shib qo'ydi muallif DylanDog, manba

DR; doktor Fix:

Sizning chizig'ingiz o'rniga:

find /Path/Folder/* -type d -mtime +7 ! -path "/Path/Folder/NODELETE1"  ! -path "/Path/Folder/NODELETE2"  ! -path "/Path/Folder/NODELETE3" -exec rm -rf {} \;

Uzunroq tushuntirish:

Chizig'ingizning -type d qismi faqatgina kataloglarni qidiradi. Lekin, siz istisno qiladigan narsalar sizning NODELETE katalogingizdagi narsalar. Bu sizning NODELETE kataloglaringiz rm -rf uchun mo'ljallangan maqsadlar bo'lib, ular o'z-o'zidan o'chiriladi.

2
qo'shib qo'ydi
Bu juda yaxshi ishlaydi!
qo'shib qo'ydi muallif DylanDog, manba

Qochish! kabi

 \! -path

bu naqsh deb talqin qilinmasligiga ishonch hosil qilish

1
qo'shib qo'ydi

Qochish! kabi

 \! -path

bu naqsh deb talqin qilinmasligiga ishonch hosil qilish

1
qo'shib qo'ydi

Qochish! kabi

 \! -path

bu naqsh deb talqin qilinmasligiga ishonch hosil qilish

1
qo'shib qo'ydi