Игнорировать пробелы для цикла при печати имени файла?

Я пытаюсь получить файлы размером более 1k и с расширением txt мой код выглядит следующим образом:

files=$(find foldername -size +1k -name \*.txt -exec {} \;) for item in $files do echo $item done 

Но я получаю неожиданный результат, как указано ниже. Пожалуйста помоги !!!

 DEST/sample - Copy - Copy.txt: line 1: Hello: command not found DEST/sample - Copy - Copy.txt: line 2: This: command not found DEST/sample - Copy - Copy.txt: line 3: In: command not found DEST/sample - Copy - Copy.txt: line 4: $'\r': command not found DEST/sample - Copy - Copy.txt: line 5: User: command not found DEST/sample - Copy - Copy.txt: line 6: -s: command not found DEST/sample - Copy - Copy.txt: line 7: -d: command not found DEST/sample - Copy - Copy.txt: line 8: -t: command not found DEST/sample - Copy - Copy.txt: line 9: $'\r': command not found DEST/sample - Copy - Copy.txt: line 10: $'\r': command not found DEST/sample - Copy - Copy.txt: line 11: Hello: command not found DEST/sample - Copy - Copy.txt: line 12: This: command not found DEST/sample - Copy - Copy.txt: line 13: In: command not found DEST/sample - Copy - Copy.txt: line 14: $'\r': command not found DEST/sample - Copy - Copy.txt: line 15: User: command not found DEST/sample - Copy - Copy.txt: line 16: -s: command not found DEST/sample - Copy - Copy.txt: line 17: -d: command not found DEST/sample - Copy - Copy.txt: line 18: -t: command not found DEST/sample - Copy - Copy.txt: line 19: $'\r': command not found DEST/sample - Copy - Copy.txt: line 20: Hello: command not found DEST/sample - Copy - Copy.txt: line 21: This: command not found DEST/sample - Copy - Copy.txt: line 22: In: command not found DEST/sample - Copy - Copy.txt: line 23: $'\r': command not found DEST/sample - Copy - Copy.txt: line 24: User: command not found DEST/sample - Copy - Copy.txt: line 25: -s: command not found DEST/sample - Copy - Copy.txt: line 26: -d: command not found DEST/sample - Copy - Copy.txt: line 27: -t: command not found DEST/sample - Copy.txt: line 1: Hello: command not found DEST/sample - Copy.txt: line 2: This: command not found DEST/sample - Copy.txt: line 3: In: command not found DEST/sample - Copy.txt: line 4: $'\r': command not found DEST/sample - Copy.txt: line 5: User: command not found DEST/sample - Copy.txt: line 6: -s: command not found DEST/sample - Copy.txt: line 7: -d: command not found DEST/sample - Copy.txt: line 8: -t: command not found DEST/sample - Copy.txt: line 9: $'\r': command not found DEST/sample - Copy.txt: line 10: $'\r': command not found DEST/sample - Copy.txt: line 11: Hello: command not found DEST/sample - Copy.txt: line 12: This: command not found DEST/sample - Copy.txt: line 13: In: command not found DEST/sample - Copy.txt: line 14: $'\r': command not found DEST/sample - Copy.txt: line 15: User: command not found DEST/sample - Copy.txt: line 16: -s: command not found DEST/sample - Copy.txt: line 17: -d: command not found DEST/sample - Copy.txt: line 18: -t: command not found DEST/sample - Copy.txt: line 19: $'\r': command not found DEST/sample - Copy.txt: line 20: Hello: command not found DEST/sample - Copy.txt: line 21: This: command not found DEST/sample - Copy.txt: line 22: In: command not found DEST/sample - Copy.txt: line 23: $'\r': command not found DEST/sample - Copy.txt: line 24: User: command not found DEST/sample - Copy.txt: line 25: -s: command not found DEST/sample - Copy.txt: line 26: -d: command not found DEST/sample - Copy.txt: line 27: -t: command not found 

3 Solutions collect form web for “Игнорировать пробелы для цикла при печати имени файла?”

Предполагая -exec – это то, что вы хотите сделать. (Опция -exec выполняет файл, который не читается)

Простое решение для печати имен файлов, соответствующих параметрам поиска:

 find foldername -size +1k -name \*.txt -print 

Если вам нужны имена, назначаемые переменной, вам нужно больше. Чтобы иметь возможность обрабатывать пробелы в именах файлов, которые возникают из команды find , опция -print0 является обычным решением:

 find foldername -size +1k -name \*.txt -print0 

Однако, чтобы читать результаты в переменной bash, это непросто.
Существует длинное объяснение на этой великолепной странице вики Грега

 #!/bin/bash unset a while IFS= read -r -d $'\0' file; do a+=( "$file" ) # or however you want to process each file done < <(find foldername -size +1k -name \*.txt -print0) printf 'filename=%s\n' "${a[@]}" 

Очевидная проблема: команда find выполняет команду -exec {} , которая пытается выполнить каждый найденный файл (источник большинства сообщений об ошибках). Возможно, вы имели в виду просто -print , например,

 files=$(find foldername -size +1k -name \*.txt -print) 

Вы также столкнетесь с проблемой со списком, если обнаружите файлы с пробелами в своих именах, но вы увидите, что как только вы найдете файлы правильно.

Есть несколько способов сделать это; здесь вы делаете небольшое изменение в своем скрипте:

 find foldername -size +1k -name \*.txt -print | \ while IFS= read -r item do echo "$item" done 

С -exec {} \; , вы сообщаете find чтобы выполнять каждый из файлов, которые он находит в качестве команды. Кажется, что вы хотели распечатать имена файлов, поэтому скажите, что: -print . Но это ломается, если имена файлов содержат пробелы . Как правило, плохая идея анализировать вывод ls или find ; сделайте это, только если вы абсолютно уверены, что имена файлов не содержат пробелов или других специальных символов.

Безопасный способ действий по find результатов состоит в том, чтобы заставить find инициировать действие. Если вам нужно использовать некоторые конструкции оболочки (несколько команд, if , переменное расширение, трубы и т. Д.), Вызовите оболочку. Передайте имя файла в качестве аргумента для этой оболочки.

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

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

 find … -exec sh -c ' for item do echo "$item" done ' sh {} + 
  • скрипт bash не создает псевдоним и не обновляет $ PS1
  • Ошибка сценария bash: источник: не найден
  • Сбой сценария резервного копирования с параметрами команды rsync в цитируемой переменной
  • Есть ли способ переносить часть форматированного текста?
  • bash + как определить переменную массива с номером экземпляра
  • Много элит, есть ли лучший способ?
  • Список переключателей «если» в любом месте?
  • Как можно выполнить команду с неизвестным числом аргументов в оболочке POSIX?
  • Как я удаляю все файлы в каталоге с конкретными расширениями, за исключением последних 5 из них
  • Как передать несколько аргументов через ssh и использовать эти аргументы в сценарии ssh?
  • Разделить входной файл на X частей общего количества строк / X
  • Interesting Posts

    Идентичный MAC-адрес на двух разных виртуальных машинах, но у меня есть подключение к Интернету

    Получить список каталогов в иерархии, которые содержат только символические ссылки

    Как скрыть список команд в Alpine?

    Какова концепция, скрытая за термином «команда»?

    Live Streaming и широковещательный видеосервер

    Возможно ли разработка Android на компьютере MIPS?

    Как отключить диапазон массива в Bash

    Ни одна из программ Linux не работает, кроме 'cd'

    Как изменить / упорядочить данные в файле с помощью Awk

    Мониторинг активности файловой системы

    как написать команду dd для замены резервной копии корневого раздела?

    Как полностью блокировать ssh и pings на сервере под управлением Oracle Linux 6.7

    Как создать виртуальную сеть для виртуальных машин

    текстовая обработка (чтение и вычисление из двух файлов)

    Переход от отдельных файлов конфигурации к каталогам .d в Linux

    Linux и Unix - лучшая ОС в мире.