для цикла в папках с \ n символом в их именах

У меня была такая же проблема. Пытался получить доступ к времени и дате, но ничего не произошло, и я получил сообщение об ошибке, но не каждый раз. Для меня решением было переустановить с помощью диспетчера синаптических пакетов следующий пакет под названием «libtimezonemap1», GTK + 3 виджета временной зоны.

1
задан 5 June 2018 в 01:21

2 ответа

Вы могли бы использовать Shell глобс вместо [Ф2]:

[Ф1]

в глоб оболочки [Ф3] соответствует все папки в текущем каталоге. Это-цикл строительства заботится о правильном разбиение автоматически.

обратите внимание, что в зависимости от параметров оболочки, это может игнорировать скрытые папки (имя, начинающееся с .). Это поведение может быть изменено, чтобы соответствовать все файлы текущей сессии с помощью команды [Ф4].

и не забывайте всегда цитирую ваши переменные.

9
ответ дан 8 June 2018 в 13:38
  • 1
    глоб найдете только файлы/каталоги в текущей директории, а не рекурсивно, как [Ф1] не – ilkkachu 5 June 2018 в 12:54
  • 2
    Вы правы @ilkkachu. Что можно изменить, включив опцию globstar оболочки [Ф1] и используя вместо [Ф2] глоб. – Byte Commander 5 June 2018 в 13:26

Оба ответа, написанные до сих пор, вызывают rmdir один раз в каталоге, но поскольку rmdir может принимать несколько аргументов, интересно: не существует ли более эффективный способ?

Можно просто сделать

rmdir */

, и это, безусловно, самый простой и эффективный способ, но он может вызвать ошибку в случае многих каталогов (см. Какая максимальная длина аргументов командной строки в gnome-терминале?). Если вы хотите, чтобы этот подход работал рекурсивно, включите опцию globstar shell с shopt -s globstar и используйте **/*/ вместо */.

С GNU find (и если мы этого не сделаем просто хочу использовать -delete), мы могли бы сделать

find -depth -type d -exec rmdir {} +

, который построит командную строку «почти так же, как xargs строит свои командные строки» (man find). Замените -depth на -maxdepth 1, если вы не хотите, чтобы он работал рекурсивно.

Третий и ИМО блестящий способ объясняется steeldriver в . Какова максимальная длина аргументов командной строки в gnome-terminal? :

printf '%s\0' */ | xargs -0 rmdir

Для построения списка аргументов с нулевым разделителем используется встроенная оболочка printf, этот список затем передается по каналу xargs, который вызывает rmdir точно так же часто, как это необходимо. Вы можете заставить его работать рекурсивно с shopt -s globstar и **/*/ вместо */, как указано выше.

6
ответ дан 8 June 2018 в 13:38
  • 1
    find является рекурсивным, но цикл OP не является. Чтобы воспроизвести это поведение, используйте find -maxdepth 1 -type d -exec rmdir {} +. (-depth является избыточным в этом случае.) Аккуратный трюк с printf для эмулирования find -print0, я этого раньше не видел. – Peter Cordes 5 June 2018 в 12:08
  • 2
    Ой! Я видел цикл ls и while, я пропустил, что они перенаправлялись из подстановки процесса с помощью find вместо того, чтобы прокладывать канал ls в цикле и просто не показывали его по какой-либо причине. Это find * действительно похоронен. Да, это рекурсивно и не удастся, если в каталоге слишком много записей каталога, включая не-каталоги, потому что он не использует */. find . будет намного лучше, потому что find быстрее на stat, чем расширение шара bash. – Peter Cordes 5 June 2018 в 12:15

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

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