Баш '. vs правильная строка

Я выполнял несколько команд поиска и заметил что-то странное о том, как bash обрабатывает . vs dir, введенный как строка.

find . -type f -exec sh -c 'cd $(dirname "$0") && aunpack "$0"' {} \;

действует совершенно по-разному

find [current dir] -type f -exec sh -c 'cd $(dirname "$0") && aunpack "$0"' {} \;

Что дает?

Делает bash лечить '.' и строка, указанная в каталоге, иначе. Нет. замените текущий каталог?

2
nl ja de
Какое поведение вы видите?
добавлено автор AlG, источник
find распечатает результаты с относительным путем.
добавлено автор KARASZI István, источник

4 ответы

Что find делает, добавляет остальную часть пути к адресу, переданному в качестве аргумента.

Т.е.: если вы находитесь в каталоге "/ home/user/find":

find .

Печать:

.
./a
./b

Но если вы попробуете:

find /home/user/find

It Печать:

/home/user/find
/home/user/find/a
/home/user/find/b

Поэтому find добавляет остальную часть пути (/ a,/b ...) к аргументу (или/home/user/find).

8
добавлено
Если бы у меня была репутация, я бы проголосовал за вас так быстро. Это 100% объясняет «странное» поведение, которое я видел между ними. и $ (pwd)
добавлено автор Techdragon, источник

@arutaku определил источник проблемы; позвольте мне указать на другое возможное решение. Если ваша версия find поддерживает его, первичный элемент -execdir делает то, что вы хотите очень просто: это cd в каталог, в который находится каждый файл, а затем выполняет команду только с помощью filename (нет пути):

find . -type f -execdir aunpack {} \;
2
добавлено

Вы можете использовать команду pwd вместо . , и она будет вести себя одинаково.

find "`pwd`"  -type f -exec sh -c 'cd $(dirname "$0") && aunpack "$0"' {} \;
2
добавлено
Потрясающие. На данный момент мои сценарии bash являются и ржавыми, и в основном связаны с моим новым проектом веб-сайта. Я так привык использовать python для всех сценариев, связанных с его очень неудобством, чтобы попытаться вернуться к сценариям оболочки для повышения мобильности для этой работы.
добавлено автор Techdragon, источник

Bash не имеет к этому никакого отношения, это логика find . Он не пытается расширять или нормализовать путь (ы) вы , он просто использует их дословно: не только для . , но и для любой спецификации пути (например, ../../ мой/другой/проект ).

Я считаю это разумным, потому что любое преобразование будет более сложным, чем текущее поведение. По крайней мере, мы должны были бы помнить, разрешены ли символические ссылки во время преобразования. И всякий раз, когда мы хотим относительный путь по какой-то причине, нам придется снова его релятивизировать.

1
добавлено
pro.bash
pro.bash
123 участник(ов)

All about Nix shells, signals, processes and development in general.