1

Есть случаи, когда вы работаете с файлами и папками, в которых есть пробелы. Проблема заключается в том, что каждый раз, когда вы пытаетесь передать файлы / папки, содержащие пробелы, в другую программу командной строки, файлы / папки, содержащие пробелы, интерпретируются как отдельные аргументы, а не как один аргумент. Например, рассмотрим следующее дерево каталогов:

Folder With Spaces
Folder With Spaces/FolderWithoutSpaces
Folder With Spaces/FolderWithoutSpaces/file with spaces.txt
FolderWithoutSpaces
FolderWithoutSpaces/fileWithoutSpaces.txt

Если вы попытаетесь выполнить команду оболочки, такую как «grep», какой-нибудь текст «$(find. -Type f)», вы получите следующий вывод:

grep: ./Folder: No such file or directory
grep: With: No such file or directory
grep: Spaces/FolderWithoutSpaces/file: No such file or directory
grep: with: No such file or directory
grep: spaces.txt: No such file or directory

Большой вопрос, как вы передаете файлы / папки, в которых есть пробелы, в качестве аргументов для программы командной строки?

4 ответа4

7

Было бы лучше, если бы вы использовали опцию -exec (опция) find и указали свои аргументы.

Пример:

find . -type f -exec grep stuff '{}' \;

Кавычки не дадут интерпретировать пробелы, и вам не придется без необходимости передавать все через xargs .

Со страницы find :

-exec команда ;

    Выполнить команду ; true, если возвращается 0 статус. Все последующие аргументы для find считаются аргументами команды до аргумента, состоящего из ' ; 'встречается. Строка ' {} ' заменяется текущим именем файла, которое обрабатывается везде, где оно встречается в аргументах команды, а не только в аргументах, где он один, как в некоторых версиях find .  Обе эти конструкции, возможно, должны быть экранированы (с ' \ ') или заключены в кавычки, чтобы защитить их от расширения оболочкой. В разделе ПРИМЕРЫ приведены примеры использования опции -exec . Указанная команда запускается один раз для каждого соответствующего файла. Команда выполняется в начальном каталоге.

    Существуют неизбежные проблемы с безопасностью, связанные с использованием действия -exec ; Вместо этого вы должны использовать опцию -execdir .

3

Передайте аргументы с помощью xargs, разделив аргументы командной строки в предыдущей программе нулевым символом, передав параметр «-0» в xargs, например:

find . -type f -print0 | xargs -0 grep -l "some text"

Эта команда будет передавать любые файлы / папки с пробелами в них как отдельные аргументы, а не как отдельные аргументы.

2

Используйте символ обратной косой черты '\' перед пробелом:

[randerson@localhost ~]$ mkdir Folder\ With\ Spaces
[randerson@localhost ~]$ ls | grep Folder\ With\ Spaces
Folder With Spaces
[randerson@localhost ~]$ 
1

Заключите имена файлов в (одинарные или двойные) кавычки:

$ mkdir "Folder With Spaces"
$ ls | grep "Folder With Spaces"
Folder With Spaces
$ ls | grep 'Folder With Spaces'
Folder With Spaces

Оболочка будет раскрывать переменные внутри двойных кавычек:

$ FOO=With
$ ls | grep "Folder $FOO Spaces"
Folder With Spaces

Вы также можете заключить в кавычки расширения $(...) если результатом будет одно имя файла:

$ ls -d "$(echo -n Folder With Spaces)"
Folder With Spaces

Это будет работать только для отдельных имен файлов; для нескольких файлов используйте find -exec или xargs как указано в других ответах.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .