find: используя {} в пути

Я случайно скопировал папки в каталоге Music в родительский каталог michal . Я хочу удалить эти каталоги одним махом.

Есть ли способ сделать следующую работу? Или есть лучшая альтернатива?

 /home/michal/Music $ find . -type d -maxdepth 1 -exec rm -r ../{} \; 

Очевидно, что {} не заменяется, потому что вышеприведенное возвращает

 rm: ../{}: No such file or directory rm: ../{}: No such file or directory rm: ../{}: No such file or directory ... 

2 Solutions collect form web for “find: используя {} в пути”

Команда find отлично работает для меня с GNU find . Если он не работает в вашей системе, попробуйте:

 find . -maxdepth 1 -type d -exec sh -c 'rm -r "../$1"' Rm {} \; 

В этом подходе используется {} как независимый аргумент, не модифицированный ../ . Мы передаем значение {} в оболочку, а оболочка применяет ../ .

Заметки:

  1. Порядок -maxdepth 1 и -maxdepth 1 -type d был отменен, поскольку man find рекомендует, чтобы глобальные параметры, такие как -maxdepth , определялись перед позиционными параметрами типа -type .

  2. Команда оболочки должна быть в одиночных кавычках: 'rm -r "../$1"' . Если бы это было в двойных кавычках, исходная оболочка заменила бы ее значение на $1 , и имя каталога, найденное find было бы проигнорировано. Нам нужно, чтобы вызванный sh выполнял подстановку. Строка "../$1" находится в двойных кавычках для защиты имени каталога, $1 , от разбиения слова и расширения пути.

  3. Оболочка назначает строку Rm $0 . Это не используется, если не появляется сообщение об ошибке. Следовательно, можно использовать любую строку.

С zsh :

 cd /home/michal && rm -rf -- Music/*(/D:t) 

Квалификатор / glob должен выбирать только каталоги, D включать скрытые, а модификатор :t , как в расширении истории, – это выбрать только хвост (имя файла без его части каталога).

С любой борнеподобной оболочкой:

 cd /home/michal/Music && set -- */ && cd .. && rm -rf -- "$@" 

Одно из отличий от вышесказанного состоит в том, что он также будет включать символические ссылки в каталоги (и удалит контент цели вместо самой ссылки).

  • найти поиск в родительских каталогах вместо подкаталогов
  • Найти все .php-файлы внутри каталогов с доступными для записи разрешениями
  • Найти файл с более длинным именем
  • найти всю директорию с тем же именем и удалить все содержимое в centos
  • ls или find, чтобы исключить двоичные файлы
  • mv с функциональностью rsync
  • Список папок верхнего уровня с содержимым не моложе 30 дней
  • использовать команду find в файле bash
  • Как связать дату команд -d @xxxxxx 'и' find ./ '?
  • как вывести вывод поиска в другой поиск
  • Поиск файлов на основе измененной даты (с указанием точного часа)
  • Linux и Unix - лучшая ОС в мире.