Intereting Posts
Исключить файлы, кроме определенных в tar Что лучше для установленных приложений: / usr / bin или домашний каталог пользователя? требуемый результат не достигается с помощью сценария bash Значение «route add -host xxx.xxx.xxx.xxx dev eth0: 1» Используйте пакет для установки зависимости и копирования пользовательского файла conf Как сгруппировать письма по отправителю и отсортировать их по времени, полученному отправителем в Mutt Малиновый Pi автоматический вход и запуск скрипта на экране Почему root должен запускать неограниченные команды как сам по doas? Проблема с установкой и запуском sysdig добавить пользователя на сервер samba После обновления сенсорная панель Synaptics дает летаргический указатель Каков формат статусной линии по умолчанию? Конфигурация OpenWRT, когда маршрутизатор находится в режиме моста Альтернативы для команды lsof? Запускает ли встроенная команда оболочки программу с ее пути?

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

Я пытаюсь получить файлы размером более 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 

Предполагая -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 {} +