Как каждый добавляет метку времени Unix на имени файла, которое является в аргументе?

Вы дважды заключенный в кавычки подстановка переменных в аргументе echo, но не замена команды в итеративном списке for цикл. Это - то, где разделение на пробеле и другой злобности происходит.

Нет никакого полностью надежного способа проанализировать вывод find, потому что Вы не можете сказать, является ли новая строка частью имени файла или разделителя.

Если можно предположить, что имена файлов не содержат новые строки, то можно расположить разделить вывод find путем ограничения символов разделителя полей только символом новой строки (для защиты пробелов и вкладок) и выключения globbing (для защиты \[?*).

IFS='
'; set +f
for f in $(find .); do
  unset IFS; set +f
  echo "$f"
done
unset IFS; set +f

Существуют лучшие способы сделать это, все же. Самый легкий способ использовать find надежно должен заставить его выполнить команду, вместо того, чтобы анализировать ее вывод. Это также потенциально быстрее, так как файлы имеют хороший шанс того, чтобы быть обработанным, в то время как их метаданные находятся все еще в кэше.

find . -exec echo {} \;

При необходимости в команде оболочки вызовите оболочку явно. Остерегайтесь заключения в кавычки — передают имя файла как аргумент оболочке, не пытайтесь интерполировать его в команде оболочки.

find . -exec sh -c 'echo "$0"' {} \;

Вместо того, чтобы вызвать один экземпляр оболочки на файл, можно сгруппировать вызовы оболочки и цикл по набору файлов. find команда делает группирование и удостоверяется для не осмотра через предел длины командной строки. Не забывайте передавать фиктивный аргумент как $0 так, чтобы файлы были $1 и так далее.

find . -exec sh -c 'for x; do echo "$x"; done' _ {} +

При использовании ksh93, удара или zsh, можно использовать их рекурсивное globbing средство: **/PATTERN поиски подстановочного шаблона в каталоге и его подкаталогах рекурсивно. В ksh93 необходимо работать set -o globstar сначала. В ударе необходимо работать shopt -s globstar во-первых, и остерегайтесь этого ** также рекурсивно вызывает внутренние символьные ссылки на каталоги.

for f in **/*; do
  echo "$f"
done

Zsh также имеет спецификаторы шарика, которые включают в категорию большую часть использования find. Другие оболочки не имеют такой вещи.

2
13.03.2015, 01:29
2 ответа

Используйте конструкцию $( ... ) для создания текстового вывода команды .... подставленной; как в...

--destinationPath="$(date)"+random.sql

Но обратите внимание, что стандартный формат даты не очень хорошо подходит для временных меток, поэтому вы обычно определяете более подходящий формат, как в...

--destinationPath=$(date +%Y%m%d%H%M%S)+random.sql
7
27.01.2020, 21:51

Мне тоже нравится. --destinationPath=$(дата +%F)+random.sql

, что дает дату типа 2015-03-17.

Полагаю, что форматами дат являются Posix форматов , используемых в strftime().

1
27.01.2020, 21:51

Теги

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