Назад | Перейти на главную страницу

однострочный цикл bash по каталогам вызывает ошибки

Я пытаюсь создать однострочник bash, чтобы перебирать каталоги в текущем каталоге и преобразовывать содержимое в уникальные тары, используя имя каталога в качестве имени файла tar. У меня есть основы работы (поиск имен каталогов и их запоминание с этими именами), но мой цикл выдает некоторые сообщения об ошибках, и я не могу понять, откуда он получает команды, которые пытается запустить.

Вот наиболее часто работающий однострочник:

for f in `ls -d */`; do `tar -czvvf ${f%/}.tar.gz $f`;done

"Странный" вывод:

-bash: drwxrwxr-x: command not found
-bash: drwxr-xr-x: command not found
-bash: drwxr-xr-x: command not found
-bash: drwxrwxr-x: command not found

Какую часть выполняемой мной команды я не понимаю и которая генерирует этот вывод?

Вам необходимо удалить задники вокруг вашего tar команда. Вы также можете подключить ls через xargs чтобы убедиться, что bash правильно выбирает все каталоги:

for f in `ls -d */ | xargs`; do tar -cvzf ${f%/}.tar.gz $f; done

Обратные кавычки фиксируют выход tar и пытается выполнить это как команду на каждой итерации цикла. Во-первых tar печатает, когда вы используете параметр -v, это разрешения для каждого файла (например, drwxrwxr-x). В этом случае вы хотите, чтобы bash выполнять команда tar, а не захват вывода.

Bjlaub правильно относительно обратных кавычек вокруг tar, однако вам не нужно использовать ls:

for file in */

сделает свое дело и будет правильно обрабатывать имена каталогов с пробелами.

Другие ответы здесь хороши, но я хотел добавить еще один вариант на случай, если вам нужно получить только каталоги, а не символические ссылки и т. Д .:

for f in `find -maxdepth 1 -type d` | do -cvzf ${f%/}.tar.gz $f; done 

Надеюсь это поможет!