Я пишу небольшой сценарий bash для архивации каталогов в сжатом формате в другое место, когда они старше определенного возраста и у меня возникают некоторые трудности. Вот что я делаю.
#!/bin/bash
# Archives completed CDP episodes to compressed storage. Will eventually expand to put these off-site as well.
InputDir="/home/wgant/stuff/"
OutputDir="/home/wgant/archived/"
find $InputDir$ -maxdepth 0 -mtime +1 -type d -exec echo $OutputDir${} \;
Я немного зеленоват в bash, поэтому я не тороплюсь. На первом этапе я просто хочу вывести список того, как будут называться выходные файлы. Однако, когда я запускаю вышеупомянутое, имена файлов правильные, но полный путь явно объединяется, чего я не хочу. Как мне просто вырезать имя файла?
Очевидно, как только это сработает, я вызову вызовы для создания архивов и удалю соответствующий каталог.
Синтаксис не совсем правильный, лучше так:
find $InputDir -maxdepth 0 -mtime +1 -type d -exec echo $OutputDir{} \;
Чтобы удалить префиксную часть путей, простой способ: cd
в каталог перед выполнением find
, как это:
InputDir="/home/wgant/stuff"
OutputDir="/home/wgant/archived"
(cd "$InputDir"; find . -maxdepth 0 -mtime +1 -type d -exec echo "$OutputDir"/{} \;)
Обратите внимание, что я заключил последнюю команду в (...)
. Это подоболочка, цель которой состоит в том, чтобы cd
команда действует только внутри нее, остальная часть скрипта не будет затронута ею. Это важно, потому что изменение рабочего каталога с помощью cd
не рекомендуется в сценариях. Обертывание внутри (...)
делает это безопасным.