Использование passwd -d
прост неправильный, по крайней мере, на Fedora, на любом дистрибутиве Linux на основе тени-utils. Если Вы удаляете пароль с passwd -d
, это означает, что любой может войти тому пользователю (на консоли или графический) в обеспечение никакого пароля.
Для блокирования логинов с аутентификацией по паролю работать passwd -l username
, который блокирует учетную запись, делающую это доступный для пользователя root только. Блокировка выполняется путем рендеринга зашифрованного пароля в недопустимую строку (путем добавления префикса зашифрованной строки!).
Любая попытка входа в систему, локальная или удаленная, приведет к "неправильному паролю", в то время как вход в систему с открытым ключом будет все еще работать. Учетная запись может затем быть разблокирована с passwd -u username
.
Если Вы хотите полностью заблокировать учетную запись, не удаляя его, редактирование /etc/passwd
и набор /sbin/nologin
или /bin/false
в последнем поле. Это приведет к "Этой учетной записи, в настоящее время не доступно". для любого входа в систему attemp.
См. passwd (1) страница справочника.
Попробуйте это:
for f in *.txt; do d="$(head -1 "$f" | awk '{print $1}').txt"; if [ ! -f "$d" ]; then mv "$f" "$d"; else echo "File '$d' already exists! Skiped '$f'"; fi; done
или более длинный вариант (как сценарий):
#!/bin/sh
for f in *.txt; do
d="$(head -1 "$f" | awk '{print $1}').txt"
if [ ! -f "$d" ]; then
mv "$f" "$d"
else
echo "File '$d' already exists! Skiped '$f'"
fi
done
В случае, если, когда целевой файл существует, эта острота пропускает его.
Вот мой подход.
#!/bin/bash
for file in *;
do
if [[ -f $file ]];
then
# cut word by single white space
fileword=$(head -n1 "$file" | cut -f1 -d" ");
# Everything after first dot is considered as extention
ext=$(echo $file | sed 's/.*\.\(.*\)/.\1/g')
[ "$file" != "$fileword" ] && $(mv "$file" "$fileword$ext")
fi;
done
Используйте эту остроту
for i in *; do if [ ! -f $i ]; then echo "skipping $i"; else newname=`head -1 $i | sed 's/^\s*\([a-zA-Z0-9]\+\).*$/\1/'`; [ -n "$newname" ] && mv -i $i $newname.txt || echo "error at: $i"; fi; done
Это заменит все файлы первым словом в том файле + .txt
. Я определил первое слово, чтобы быть первым вхождением [a-zA-Z0-9]+
, отбрасывание ведущих пробелов.
Отказ от ответственности: Просто используйте его, если Вы уверены, что существует первое слово на строке один в каждом файле! Иначе Вы могли бы испытать неожиданные результаты ;-)
*
.
– Gilles 'SO- stop being evil'
14.05.2011, 14:07
for i in *.txt
do
d="$(head -1 "$i" | cut -d " " -f1).txt";
mv "$i" "$d"
done
На Вашем собственном риске::)
find -exec echo -n mv {} " " ";" -exec sed '1s/ .*//;q' {} ";" > tmp.sh && bash tmp.sh
Это работает с легкими именами файлов, содержа легкие слова. Файл "O'Reilly", содержащий как первое слово "Eto'o", перестанет работать. Скудно.
some'thing
, или если первое слово D'oh
?
– Gilles 'SO- stop being evil'
14.06.2011, 12:18
mv
тут же, как другие ответы. Можно сохранить команду sed, это - прекрасный способ извлечь первое слово.
– Gilles 'SO- stop being evil'
15.06.2011, 11:04
... > tmp.sh
, и рассмотрите tmp.sh вручную. Затем вызовите bash tmp.sh
. С большим количеством броских имен файлов я не сделал бы этого вообще. Но одно или два ручных исправления были бы прекрасны в 100 файлах. Приблизительно в 1 000 файлов ручной обзор начал бы становиться работой.
– user unknown
15.06.2011, 20:14
head -1 "$f" | awk '{print $1}'
кому:<"$f" awk {print $1; exit}
. – Gilles 'SO- stop being evil' 14.05.2011, 14:09