Да, если у Вас есть GNU find
и GNU sed
, попробуйте это в родительской папке:
find . -type f \( -iname "*.htm" -o -iname "*.html" \) -exec sed -i.bak 's#/contact/index\.html#/contact/index.php#' '{}' +
Это найдет все файлы, имя которых заканчивается в .html
или .HTML
или .htm
или .HTM
(или .HtM
...) и выполненный это sed
команда на них:
sed -i.bak 's#/contact/index\.html#/contact/index.php#g'
Это сделает замену, Вы хотите и создаете резервное копирование оригинала foo.htm
названный foo.htm.bak
. Если Вы не хотите резервные копии, просто удалите .bak
.
Подробнее:
find
команда, очевидно, находит файлы или папки. Это - синтаксис, может быть довольно сложным и объяснен подробно в man page
часть из которого воспроизводится ниже:
Общий формат find [where] [what]
. В примере я дал выше, where
.
что означает текущий каталог. what
все файлы, которые имеют a html
или подобное расширение, таким образом, я использую iname
который является:
-iname pattern
Like -name, but the match is case insensitive.
For example, the patterns `fo*' and `F??'
match the file names `Foo', `FOO', `foo',
`fOo', etc.
Однако я хочу, чтобы это соответствовало обоим html
и htm
таким образом, я использую -o
флаг, что означает:
expr1 -o expr2
Or; expr2 is not evaluated if expr1 is true.
Такие конструкции должны группироваться, который сделан круглыми скобками ( )
которого, однако, нужно оставить из оболочки, таким образом, мы используем \(
и \)
.
Волшебство происходит в -exec
часть:
-exec command ;
Execute command; true if 0 status is returned.
All following arguments to find are taken to
be arguments to the command until an argument
consisting of `;' is encountered. The string
`{}' is replaced by the current file name
being processed everywhere it occurs in the
arguments to the command, not just in argu‐
ments where it is alone, as in some versions
of find. [...] The specified command is
run once for each matched file. The command
is executed in the starting directory. There
are unavoidable security problems surrounding
use of the -exec action; you should use the
-execdir option instead.
Другими словами, учитывая команду как -exec ls {}
,find
найдет все файлы, соответствующие условиям, которые Вы установили и выполняете итерации через них, заменяя {}
с текущим именем файла и выполнением данной команды. Я также использую +
вместо \;
закончиться exec
звоните, потому что это вызовет find
чтобы попытаться выполнить как можно меньше команд, это - просто незначительная оптимизация, если у Вас нет тысяч файлов, когда это могло быть важно:
-exec command {} +
This variant of the -exec action runs the
specified command on the selected files, but
the command line is built by appending each
selected file name at the end; the total num‐
ber of invocations of the command will be much
less than the number of matched files. The
command line is built in much the same way
that xargs builds its command lines. Only one
instance of `{}' is allowed within the com‐
mand. The command is executed in the starting
directory.
Наконец, sed
текстовый потоковый редактор командной строки, это применит команду, которую Вы даете ему каждой строке файла. В этом случае команда является заменой, основной формат:
s#pattern#replacement#flags
Разделители (#
) может быть любой специальный символ и традиционно /
но я выбрал #
потому что иначе я должен был бы выйти /
. Обратите внимание, что ChrisDown в его ответе принял решение использовать |
. Это - просто личный выбор, и эти два эквивалентны.
# echo -n admin123 | makepasswd --crypt-md5 --clearfrom -
admin123 $1$ZUNNSLzQ$XsViFC1bhucsr3f8AzMPt/
Как прокомментировано ниже, эта команда небезопасна. Истинный метод - записать пароль в файл с помощью текстового редактора, и прочитать пароль из файла.
] Ваш метод не работает, так как []makepasswd[
] не принимает пароль в качестве аргумента, вместо этого нужно создать временный текстовый файл, чтобы сделать пароль, если вы хотите сгенерировать хэш на основе пароля:[
➜ ~ makepasswd --crypt-md5 --clearfrom file
admin123 $1$iQd/ujH.$rMXZiYwQC1Rc/rgO3.FeX/
]
[]Конечно, не используйте командную строку для хранения пароля, так как он будет доступен любому, кто может прочитать историю команд или аргументы процесса.[
].Вместо этого вы можете использовать алгоритм AES (Advanced Enryption Standard), который является открытым исходным кодом и относительно надежно защищен для шифрования вашего пароля.
ссылки: https://www.aescrypt.com/
Другой способ таков:openssl passwd -1 -stdin <<< password_here
Это не показывает пароль в списке процессов. Дополнительные параметры см. openssl passwd --help
Просто беги:
openssl passwd -6 -stdin
, а затем введите/вставьте свой пароль, затем ENTER , затем Ctrl+D("конец файла" ). Пароль не будет отображаться в списке процессов, и пароль не будет сохранен в истории оболочки.
Посмотреть другие алгоритмы паролей с помощью:
% openssl passwd -help
Usage: passwd [options]
Valid options are:
-help Display this summary
-in infile Read passwords from file
-noverify Never verify when reading password from terminal
-quiet No warnings
-table Format output as table
-reverse Switch table columns
-salt val Use provided salt
-stdin Read passwords from stdin
-6 SHA512-based password algorithm
-5 SHA256-based password algorithm
-apr1 MD5-based password algorithm, Apache variant
-1 MD5-based password algorithm
-aixmd5 AIX MD5-based password algorithm
-crypt Standard Unix password algorithm (default)
-rand val Load the file(s) into the random number generator
-writerand outfile Write random data to the specified file