Я пытаюсь создать однострочник 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
Надеюсь это поможет!