Найдите файл, затем перейдите в этот каталог в Linux.

В сценарии оболочки, как мне найти файл по определенному имени, а затем перейти в этот каталог, чтобы выполнить дальнейшие операции с ним?

Отсюда я собираюсь скопировать файл в другой каталог (но я могу сделать это, просто добавив его для контекста.)

23
задан NathanOliver- Reinstate Monica 8 June 2015 в 15:18
поделиться

4 ответа

Вы можете использовать что-то вроде:

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]> _
24
ответ дан 29 November 2019 в 01:43
поделиться

если вы просто находите файл и затем перемещаете его в другое место, просто используйте find и -exec

find /path -type f -iname "mytext.txt" -exec mv "{}" /destination +;
1
ответ дан 29 November 2019 в 01:43
поделиться

Если это программа из вашего ПУТЬ , вы можете сделать:

cd "$(dirname "$(which ls)")"

или в Bash:

cd "$(dirname "$(type -P ls)")"

, который использует на один внешний исполняемый файл меньше.

Здесь не используются внешние элементы:

dest=$(type -P ls); cd "${dest%/*}"
0
ответ дан 29 November 2019 в 01:43
поделиться

Следующий вариант должен быть более безопасным:

cd -- "$(find / -name ls -type f -printf '%h' -quit)"

Преимущества:

  • Двойное тире предотвращает интерпретацию имени каталога, начинающегося с дефиса, как опции (find не выдает таких имен файлов, но это не вредно и может потребоваться для подобных конструкций)
  • -name проверка перед -type проверкой, потому что последняя иногда требует stat
  • Не требуется dirname, потому что спецификатор %h уже печатает имя каталога
  • -quit для остановки поиска после первого найденного файла, таким образом, не требуется head, что привело бы к ошибке скрипта на именах каталогов, содержащих новые строки
11
ответ дан 29 November 2019 в 01:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: