Когда я запускаю эту команду, она работает:
$ find . -inum 888696 -exec ls '{}' \;
Conversation.pst Outlook Data File Outlook Data File.sbd Trash Unsent Messages
Inbox.pst Outlook Data File.msf Sent.pst Trash.msf Unsent Messages.msf
Однако при замене ls
на cd
него не работает:
$ find . -inum 888696 -exec cd '{}' \;
find: ‘cd’: No such file or directory
Я знаю, cd
что это bash
встроенный, поэтому я попробовал это, которое также не работает:
$ find . -inum 888696 -exec builtin cd '{}' \;
find: ‘builtin’: No such file or directory
Как я могу использовать cd
вместе с find -exec
командой?
ОБНОВИТЬ
Поэтому я пытаюсь использовать cd
с в find -exec
том , что имя каталога является странным один , который показывает на моем терминале , как что - то вроде ????
.
bash
find
cd-command
user3405291
источник
источник
LC_ALL=C printf '%q\n' *
напечатать имена ASCII для всех файлов в вашем текущем каталоге, по одному в строке (с изменением новой строки$'\n'
или аналогичной).Ответы:
-exec
Опцияfind
выполняет внешнюю утилиту, возможно , с некоторым параметром командной строки и другими аргументами.Ваш Unix не предоставляет
cd
как внешнюю утилиту, только как встроенную оболочку, поэтомуfind
не может ее выполнить. По крайней мере , MacOS и Solaris действительно обеспечивают вcd
качестве внешней полезности.Выполнение
cd
таким способом будет мало или вообще бесполезно , кроме как для проверки того, является ли найденный путьfind
каталогом, в который вы сможетеcd
. Рабочий каталог в вашей интерактивной оболочке (или как бы он ни вызывалfind
) в любом случае не изменится.Связанные с:
Если у вас есть проблемы со странным или чрезвычайно трудным для ввода именем каталога, и вы хотите перейти в этот каталог, подумайте о создании символической ссылки на каталог, а затем
cd
в нее, используя вместо этого эту ссылку:Это создаст символическую ссылку с именем,
thedir
которая будет указывать на проблемный каталог. Затем вы можете изменить рабочий каталог с помощью(если ссылка существует в текущем каталоге). Это позволяет избежать изменения каталога в любом случае. Другая идея заключается в том, чтобы переименовать каталог аналогичным образом
find
, но это не рекомендуется, если другая программа ожидает, что каталог будет иметь это конкретное имя.источник
cd
с вfind -exec
том , что имена каталогов в некоторых странных символов , которые не показывают правильно на мой терминал.cd
в каталог с плохим именем, и я не могуcd
войти в него обычным способом./bin/cd
это результат POSIX ( pubs.opengroup.org/onlinepubs/9699919799/utilities/… ), где обычные встроенные функции должны быть доступны для exec (). Конечно,/bin/cd
вероятно, не делает то, что хотят люди :-)find
запускает-exec
саму команду, она не включает оболочку. Даже если это произойдет, изменение каталога будет сохраняться только до выхода из этой оболочки, сразу послеcd
.Вам нужно будет передать имя файла в текущую оболочку
cd
. В зависимости от того, насколько плохи ваши имена файлов, вы можете использовать подстановку команд:Это не сработает, если имя файла заканчивается на новой строке, так как подстановка команд пожирает завершающие символы новой строки. В этом случае вам нужно будет защитить символ новой строки и избавиться от
find
добавленного при печати:Или, с помощью GNU
find
, он не должен печатать завершающий символ новой строки (но все равно защищать любой в имени файла):Также используя
-quit
предикат (также расширение GNU), чтобы перестать смотреть на первое совпадение в качестве оптимизации.В качестве альтернативы, вы можете запустить новую оболочку изнутри
find
, но это немного уродливо:источник
find
добавляется сама новая строка при печати. Ред.dir=$(find -print0)
что все равно будетНе с exec, но этого может быть достаточно для вас:
«Тип d», просто чтобы быть уверенным. Что я не знаю.
источник
mkdir $'foo\n'
отлично работает здесь; Я еще не видел собственную файловую систему UNIX, где она не поддерживалась.Используйте поток с разделителями NUL для чтения выходных данных,
find
которые работают во всех случаях, включая имена, заканчивающиеся символом новой строки. Кроме того, вы можете использоватьprintf '%q'
для создания удобочитаемого представления имени файла.источник
Если вы получили это сообщение, значит, ваша платформа ОС глючит. Стандарт POSIX требует, чтобы именованная команда
cd
была доступна в файловой системе, чтобы ее можно было вызывать с помощьюexec()
.Теперь плохие новости для вас:
Даже если в вашей платформе ОС не было ошибок, вы просто не увидели предупреждение, но не получили ожидаемых результатов, поскольку это не поможет вам, если отдельная программа изменит свой текущий рабочий каталог и сразу же умрет после этого.
Если вы хотите иметь эффективную
cd
команду, выполняемуюfind
, вы можете сделать что-то вроде:источник
sh
, а не то, что вы хотели бы сделать. Лучше избегать фиктивных значений для этого встроенного скрипта,$0
как это используется, например, в сообщениях об ошибках (например, когда это неcd
получится).cd "$1"
? Если имя сложно ввести, оно также может содержать метасимволы оболочки ...