команда find: используя {} в пути

Вы смотрели ffmpeg? Это инструмент, который может конвертировать огромное количество мультимедийных кодеков в другие кодеки.

1
27.09.2016, 04:23
2 ответа

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

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

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

Примечания:

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

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

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

3
27.01.2020, 23:25

С zsh :

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

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

С любой оболочкой, подобной Bourne:

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

Одно отличие от приведенного выше состоит в том, что она также включает символические ссылки на каталоги (и удаляет содержимое target вместо самой ссылки).

0
27.01.2020, 23:25

Теги

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