Как я могу рекурсивно удалить все файлы определенного расширения в текущем каталоге?

Как безопасно удалить все файлы с определенным расширением (например, .bak) из текущего каталога и всех подпапок, используя одну командную строку? Просто я боюсь использовать rm, так как однажды использовал это неправильно, и теперь мне нужен совет.

735
задан 15 November 2013 в 20:16

9 ответов

ამ შემთხვევაში rm გამოყენება არც გჭირდებათ, თუ გეშინიათ. გამოიყენეთ იპოვეთ :

find . -name "*.bak" -type f -delete

მაგრამ გამოიყენეთ იგი სიფრთხილით. პირველი გაუშვით:

find . -name "*.bak" -type f

რომ ნახოთ, კონკრეტულად რომელ ფაილებს ამოიღებთ.

ასევე, დარწმუნდით, რომ -delete არის უკანასკნელი არგუმენტი თქვენს ბრძანებაში. თუ ამას დააყენებთ -name * .bak არგუმენტამდე , ის წაშლის ყველაფერს .

იხილეთ man find and man rm დამატებითი ინფორმაციისთვის და აგრეთვე ამ კითხვაზე იხილეთ SE:

1059
ответ дан 15 November 2013 в 20:16
find . -name "*.bak" -type f -print0 | xargs -0 /bin/rm -f
48
ответ дан 15 November 2013 в 20:16

პირველი გაუშვით ბრძანება shopt -s globstar . ამის გაშვება შეგიძლიათ ბრძანების სტრიქონზე და ის იმოქმედებს მხოლოდ იმ გარსის ფანჯარაში. თქვენ შეგიძლიათ განათავსოთ ის თქვენს .bashrc - ში, შემდეგ კი ყველა ახლად დაწყებული ჭურვი აიღებს მას. ამ ბრძანების მოქმედებაა ** / ფაილების რეკურსიულად დალაგება მიმდინარე დირექტორიაში და მის ქვე დირექტორიებში (სტანდარტულად, ** / ნიშნავს იგივე, რაც * / :მხოლოდ უშუალო ქვეწარმოებებში). შემდეგ:

rm **/*.bak

(ან gvfs-trash ** / *. Bak ან რა გაქვთ).

40
ответ дан 15 November 2013 в 20:16

ფაილების წაშლა ჩემთვის არ არის ისეთი რამ, რაც თქვენ გჭირდებათ გამოიყენეთ rm ამისთვის. აქ არის ალტერნატივა:

sudo apt-get install gvfs     # install a tool that allows you to put stuff in the trash
alias "trash"="gvfs-trash"    # you can also put this in .bash_aliases or simply use the command without alias
trash *.bak                   # trash the files (thus moving them to the trash bin)

როგორც ფლიმი აღნიშნავს კომენტარებში:

პაკეტი trash-cli აკეთებს იგივე რამეს, რაც gvfs-trash gvf- ზე დამოკიდებულების გარეშე.

ასე რომ:

sudo apt-get install trash-cli

ამისათვის საჭირო არ არის ზედმეტსახელის გაკეთება, რადგან trash-cli პაკეტი გთავაზობთ ბრძანებას ნაგავი , რომელიც აკეთებს იმას, რაც ჩვენ გვინდა.

როგორც ელია კაგანი განმარტავს ვრცელ კომენტარებში, ასევე შეგიძლიათ გააკეთოთ ეს რეკურსივი find . ამ შემთხვევაში ვერ გამოიყენებთ მეტსახელად, ამიტომ ქვემოთ მოცემული ბრძანებების თანახმად, თქვენ დააინსტალირეთ trash-cli . მე შევაჯამებ ელიას კომენტარებს:

ეს ბრძანება პოულობს და აჩვენებს ყველა .bak ფაილებს და ბმულებს სადმე მიმდინარე დირექტორიაში ან მის ქვე დირექტორიებში ან ქვემოთ.

find . -name '*.bak' -xtype f

მათი წასაშლელად დაამატეთ -exec ნაგვის ბრძანებით:

find . -name '*.bak' -xtype f -exec trash {} +

-xtype f ირჩევს ფაილებს და ფაილების ბმულებს, მაგრამ არა საქაღალდეებს. .Bak საქაღალდეების წასაშლელად, წაშალეთ ის ნაწილი და გამოიყენეთ -execdir , რომელიც თავიდან აიცილებს არ შეუძლია წაშლილი არ იყოს შეცდომების .bak ფაილების შიგნით .bak დირექტორიები:

find . -name '*.bak' -execdir trash {} +
22
ответ дан 15 November 2013 в 20:16
  • 1
    You' ve, вероятно, право, I' отпуск ll это, поскольку это должно избежать проблем. Но удовлетворить мое любопытство, я попытаюсь сделать это на виртуальной машине. Спасибо всем – Yseader 14 May 2015 в 03:09

Если вы хотите удалить все файлы определенного типа, но только 1 папку "глубоко" из текущей папки:

find . -maxdepth 2 -name "*.log" -type f -delete

-maxdepth 2 , потому что текущий каталог ". "считается первой папкой.

5
ответ дан 15 November 2013 в 20:16

Если вы находитесь в git-репо, вы можете использовать:

git clean -fdx

Это удаляет неотслеживаемые файлы и файлы в .gitignore.

0
ответ дан 15 November 2013 в 20:16
  • 1
    Никакой it' s не только для Gnome, Gahshomar говорят быть Уокингом с разнообразием DES ОС как Ubuntu, Lubuntu, Debian, ArchLinux и т.д...., Вы пробовали, устанавливают его? – JoKeR 14 May 2015 в 12:00

Быстрый ответ:

  • Рекурсивно удалить все файлы с заданным именем или постфиксом:

    найти. -name '* .pyc' -type f -delete

  • Рекурсивно удалить все каталоги с заданным именем:

     find ~ -path '* / __ pycache __ / *' -delete‍‍‍
    find ~ -type d -name '__pycache__' -empty -delete‍‍‍
     

    Несколько менее жестко, но в одной строке:

     find ~ -path '* / __ pycache __ *' -delete
      

[ ПРИМЕЧАНИЕ ]:

d - это параметр каталога, а f - параметр файла.

1
ответ дан 15 November 2013 в 20:16

Если вы хотите проверить список перед удалением файлы, вы можете повторить его.

find . -name "*.bak" -type f | xargs echo rm -rf

Будет выведен список результатов поиска, которые передаются команде rm через xargs. Если вы уверены в списке, вы можете отбросить эхо в приведенной выше команде.

find . -name "*.bak" -type f | xargs rm -rf
0
ответ дан 5 January 2021 в 23:16

Перед использованием rm вы можете сначала перечислить все файлы с этим расширением. Например,

ls *.bak

Если вы получили только те файлы, которые хотите удалить, вы можете использовать rm

rm *.bak
1
ответ дан 28 July 2021 в 15:38

Другие вопросы по тегам:

Похожие вопросы: