Как использовать find с путями, перечисленными в файле, при этом гарантируя, что пробелы будут учтены?

Я предпочитаю решение, данное здесь автором Карлом Уилбуром, поскольку оно не требует "предварительных" шагов, таких как запуск скрипта.

Суть:

  • тройной -щелчок по последней строке
  • нажмите Shift + домой
  • Shift + щелчок по первой строке // (или в любом другом месте! )//

и вы выбрали все необходимые выходные данные.

Другой способ — использовать «Правка» -> «Выбрать все» в меню «Терминал». Но речь идет только обо всем выборе вывода.

3
19.11.2021, 19:45
2 ответа

Подход readarrayявляется самым простым, но если вы используете оболочку, которая его не поддерживает, вместо этого вы можете попробовать следующее, что должно работать в любой оболочке POSIX:

while IFS= read -r pathname; do
    find "$pathname" -type f
done < pathlist.txt
3
20.11.2021, 09:55

Если вы используете реализацию xargs в GNU, вы можете использовать параметр -dдля установки разделителя, в данном случае новой строки.

Демо:

xargs -d '\n' -I{} printf '<<%s>>\n' '{}' <<END
abc def
unix and linux
END
<<abc def>>
<<unix and linux>>

Таким образом, первый удар по вашей команде будет

xargs -a pathlist.txt -d '\n' -I{} -- \
   find '{}' -type f -printf "%p, %AY-%Am-%Ad \n"

Здесь есть две проблемы:

  • Теперь он будет запускать несколько findэкземпляров, поскольку замена xargs -Iподразумевает -L1.
  • У вас все еще будут проблемы с именами файлов, которые содержат символы новой строки.

Вы можете решить первую проблему, используя GNU printf %qдля создания экранированных строк для оболочки:

find $(xargs -a pathlist.txt -d '\n' printf '%q\n') \
    -type f -printf "%p, %AY-%Am-%Ad \n"

Для второго рассмотрите возможность разделения с помощью \0вместо этого и использования xargs -0, чтобы использовать его в качестве разделителя.

3
20.11.2021, 12:37

Теги

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