В сценарии оболочки, как мне найти файл по определенному имени, а затем перейти в этот каталог, чтобы выполнить дальнейшие операции с ним?
Отсюда я собираюсь скопировать файл в другой каталог (но я могу сделать это, просто добавив его для контекста.)
Вы можете использовать что-то вроде:
pax[/home/pax]> cd "$(dirname "$(find / -type f -name ls | head -1)")"
pax[/usr/bin]> _
Это позволит найти сначала обычный файл ls
, затем перейдите в этот каталог.
С точки зрения того, что делает каждый бит:
/
и будет искать вниз, перечисляя все обычные файлы ( -тип f
) с именем ls
( -имя ls
). Есть и другие вещи, которые вы можете добавить в find
, чтобы еще больше ограничить файлы, которые вы получаете. головку -1
отфильтрует все, кроме первого. $ ()
- это способ получить вывод команды и поместить его в командную строку для другой команды. dirname
может взять полную спецификацию файла и дать вам бит пути. cd
просто переходит в этот каталог. Если вы выполните каждый бит последовательно, вы увидите, что произойдет:
pax[/home/pax]> find / -type f -name ls
/usr/bin/ls
pax[/home/pax]> find / -type f -name ls | head -1
/usr/bin/ls
pax[/home/pax]> dirname "$(find / -type f -name ls | head -1)"
/usr/bin
pax[/home/pax]> cd "$(dirname "$(find / -type f -name ls | head -1)")"
pax[/usr/bin]> _
если вы просто находите файл и затем перемещаете его в другое место, просто используйте find и -exec
find /path -type f -iname "mytext.txt" -exec mv "{}" /destination +;
Если это программа из вашего ПУТЬ
, вы можете сделать:
cd "$(dirname "$(which ls)")"
или в Bash:
cd "$(dirname "$(type -P ls)")"
, который использует на один внешний исполняемый файл меньше.
Здесь не используются внешние элементы:
dest=$(type -P ls); cd "${dest%/*}"
Следующий вариант должен быть более безопасным:
cd -- "$(find / -name ls -type f -printf '%h' -quit)"
Преимущества:
find
не выдает таких имен файлов, но это не вредно и может потребоваться для подобных конструкций)-name
проверка перед -type
проверкой, потому что последняя иногда требует stat
dirname
, потому что спецификатор %h
уже печатает имя каталога-quit
для остановки поиска после первого найденного файла, таким образом, не требуется head
, что привело бы к ошибке скрипта на именах каталогов, содержащих новые строки