У меня есть сценарий bash для развертывания кода из бета-среды в производственной среде, но в настоящее время я вынужден вручную добавить список файлов в текстовый файл, а иногда мне не хватает некоторых. В основном мой сценарий развертывания cat / loops копирует файлы. (экспорт / импорт дБ, но это не актуально .. лол)
В любом случае, я хотел бы использовать find
команду для создания списка файлов, измененных за последние 14 дней. Проблема в том, что мне нужно удалить путь, ./
чтобы скрипт развертывания работал.
Вот пример использования команды find:
находить . -type f -mtime -14> deploy.txt
Вот строчка, которую коты deploy.txt
в моем сценарии развертывания:
for i in `cat deploy.txt`; do cp -i /home/user/beta/public_html/$i /home/user/public_html/$i; done
Любая идея, как сделать это с помощью сценариев Bash?
Благодарность!
--dry-run
режиме и вывести его в файл для просмотра?Ответы:
Вы можете использовать параметр
-printf
командной строки%f
для печати только имени файла без какой-либо информации каталогаили вы можете использовать sed, чтобы просто удалить ./
источник
/.
.|
в качестве разделителя.%f
удалит все каталоги, а не только./
. Это нарушит его сценарий развертывания, если какой-либо из файлов, возвращаемых имfind
, находится в подкаталогах..
. И, возможно, лучше всего использовать якорь начала строки:s|^\./||
%P
вместо%f
. Это просто отрезало путь, указанный в командной строке../
Должно быть безвредным. Большинство программ будут относиться/foo/bar
и/foo/./bar
как к эквиваленту. Я понимаю, что это выглядит не очень хорошо, но на основании того, что вы опубликовали, я не вижу причин, по которым это может привести к сбою вашего сценария.Если вы действительно хотите избавиться от него,
sed
возможно, это самый чистый способ:Если вы работаете в системе с GNU find (например, в большинстве систем Linux), вы можете сделать это за один раз
find -printf
:В
%P
возвращает полный путь каждого найденного файла, минус путь , указанный в командной строке, вплоть до и включая первый слэш. Это сохранит все подкаталоги в вашей структуре каталогов.источник
./
Приставка на самом деле функция; без него передача данных в другие команды не будет работать правильно, например, для имен файлов, начинающихся с тире.Зачем тебе раздеваться
./
? Это действительно иметь в пути. Такэто просто хорошо!
Но если вы хотите удалить имя каталога в find, вы можете использовать
%P
arg для-printf
.человек найти (1) говорит:
Пример
Следите за первой пустой строкой! Если Вы хотите избежать этого, используйте
-mindepth 1
источник
Ну, у вас есть несколько вариантов. Вы можете использовать
-printf
опцию в find, чтобы распечатать только имя файла, или вы можете использовать инструмент вроде sed, чтобы просто вырезать./
.источник
Решение "find -printf" не будет работать во FreeBSD, потому что у find нет такой опции. В этом случае AWK может помочь. Возвращает фамилию ($ NF), поэтому может работать на любой глубине.
PS: взято из книги Д.Тэнсли "Программирование под Linux и Unix shell"
источник
Быстрое решение, если я правильно понимаю вопрос, заключается в использовании
cut
на выходеfind
команды:Это удалит первый символ из каждой строки результата (в вашем случае
./
). Вероятно, не лучшее решение, но работает в вашем сценарии.источник
sed
идеально подходит для такого рода вещей.источник
Я не знаю, о каких именах файлов мы говорим, но что-то с пробелами или символами новой строки ставит большинство решений здесь под угрозу.
Я бы предложил использовать расширение параметров оболочки для удаления символов из каждого имени файла:
Если вам действительно нравятся каналы, вы можете использовать «безопасный» разделитель, например ноль, с xargs для получения каждого имени файла:
Помните, что вывод этого НЕ НЕ разделен нулем, поэтому, хотя этого может быть достаточно для проверки глазного яблока, ни одно из этих решений не создает файл deploy.txt, который можно безопасно использовать для автоматизации, если вы не очень уверены в своем источнике имена файлов.
источник