1

Я написал короткое while - do цикл, но я нахожу его странным для разных оболочек.

Это оно:

find "`pwd`" -type d | while read -r D; do ls ${D}; done

Когда я запускаю его, используя zsh , все идет хорошо. Однако, используя любую другую оболочку, она ломается, когда я запускаю ее в любом каталоге с экранированным символом в заголовке.

Почему это так? Я пытался поиграть с read -d , но он игнорирует любые экранированные символы, такие как \n. read -r также ничего не делает.

2 ответа2

1

Попробуйте это:find "$(pwd)" -type d | while read -r D; do ls -lb "${D}"; done

Только с ls все, что вы увидите в bash, это ? для имени файла, равного, например, "\n".
Также -print0 | xarg -0 вполне может быть необходимым в этих случаях, и без кавычек $D $ , когда D содержит пробелы, вероятно, является причиной для беспокойства.

$ man ls выдержка:

-b, --escape
      print C-style escapes for nongraphic characters
-l    use a long listing format


Неразумный материал:
Пример: $ rm "$(echo -en "\r")" - позволяет удалить файл с одиночным возвратом каретки (CR) в качестве имени.

И, конечно, если вы хотите возиться с этим:
$ echo "TEST" >"This is a filename with a CR _$(echo -en "\r")_here"
... создает файл.

$ rm "This is a filename with a CR _$(echo -en "\r")_here"
... чтобы удалить это.

0

Почему это так?

${D} совпадает с $D Он будет заменен оболочкой на содержимое переменной D Так что, если D содержит Hello World , ваш

ls -lb $D

становится

ls -lb Hello World

который попытается перечислить 2 каталога Hello и World (вместо 1 каталога Hello World).

Скотт уже дал вам правильный путь: используйте "$D" , что приведет к

ls -lb "Hello World"

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