Переименование нескольких файлов на основе их содержания

Использование passwd -d прост неправильный, по крайней мере, на Fedora, на любом дистрибутиве Linux на основе тени-utils. Если Вы удаляете пароль с passwd -d, это означает, что любой может войти тому пользователю (на консоли или графический) в обеспечение никакого пароля.

Для блокирования логинов с аутентификацией по паролю работать passwd -l username, который блокирует учетную запись, делающую это доступный для пользователя root только. Блокировка выполняется путем рендеринга зашифрованного пароля в недопустимую строку (путем добавления префикса зашифрованной строки!).

Любая попытка входа в систему, локальная или удаленная, приведет к "неправильному паролю", в то время как вход в систему с открытым ключом будет все еще работать. Учетная запись может затем быть разблокирована с passwd -u username.

Если Вы хотите полностью заблокировать учетную запись, не удаляя его, редактирование /etc/passwd и набор /sbin/nologin или /bin/false в последнем поле. Это приведет к "Этой учетной записи, в настоящее время не доступно". для любого входа в систему attemp.

См. passwd (1) страница справочника.

4
20.05.2011, 16:05
6 ответов

Попробуйте это:

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

В случае, если, когда целевой файл существует, эта острота пропускает его.

7
27.01.2020, 20:49
  • 1
    я упростил бы head -1 "$f" | awk '{print $1}' кому: <"$f" awk {print $1; exit}. –  Gilles 'SO- stop being evil' 14.05.2011, 14:09
  • 2
    Это не работает, если первая строка имеет пробелы в ней... –  Guillochon 08.11.2017, 18:22

Вот мой подход.

#!/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
4
27.01.2020, 20:49

Используйте эту остроту

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]+, отбрасывание ведущих пробелов.
Отказ от ответственности: Просто используйте его, если Вы уверены, что существует первое слово на строке один в каждом файле! Иначе Вы могли бы испытать неожиданные результаты ;-)

1
27.01.2020, 20:49
for i in *.txt
do
d="$(head -1 "$i" | cut -d " " -f1).txt";
mv "$i" "$d"
done
0
27.01.2020, 20:49
  • 1
    Символ после первого слова мог отличаться, чем пространство (запятая, например) –  Philippe Blayo 19.11.2012, 20:40
for i in *.txt; do mv "$i" "$(head -1 "$i")".txt; done
-1
27.01.2020, 20:49
  • 1
    Первое слово, не первая строка. –  Gilles 'SO- stop being evil' 14.06.2011, 12:16

На Вашем собственном риске::)

find -exec echo -n mv {} " " ";" -exec sed '1s/ .*//;q' {} ";" > tmp.sh && bash tmp.sh

Это работает с легкими именами файлов, содержа легкие слова. Файл "O'Reilly", содержащий как первое слово "Eto'o", перестанет работать. Скудно.

-2
27.01.2020, 20:49
  • 1
    Вы пропускаете шаг заключения в кавычки. Что, если существует названный файл some'thing, или если первое слово D'oh? –  Gilles 'SO- stop being evil' 14.06.2011, 12:18
  • 2
    Да, я вижу. Как Вы сделали бы это? Нисколько - выбирают другой подход? –  user unknown 14.06.2011, 23:00
  • 3
    Технически возможно генерировать сценарий оболочки, но это призывает к проблеме. “Просто” необходимо разобраться в заключении в кавычки. Нет никакого призыва к нему здесь, просто извлеките первое слово и вызов mv тут же, как другие ответы. Можно сохранить команду sed, это - прекрасный способ извлечь первое слово. –  Gilles 'SO- stop being evil' 15.06.2011, 11:04
  • 4
    В практике я, если бы я использовал этот подход, использовал бы две команды - ... > tmp.sh, и рассмотрите tmp.sh вручную. Затем вызовите bash tmp.sh. С большим количеством броских имен файлов я не сделал бы этого вообще. Но одно или два ручных исправления были бы прекрасны в 100 файлах. Приблизительно в 1 000 файлов ручной обзор начал бы становиться работой. –  user unknown 15.06.2011, 20:14

Теги

Похожие вопросы