Intereting Posts
Заменить значения в определенном разделе в файле Приложения с зависимостями Gtk2 в среде KDE «Brew install -s» не компилируется из исходного кода Перенаправление трафика DNS для определенного домена Как перемещать swap рядом с началом жесткого диска Фокусировка клиента, указав его направление от текущего клиента остановить внешний жесткий диск от групповой дискеты clonezilla – восстановить образ раздела ОС ОС Windows для большего / меньшего раздела пытается выполнить операцию base62 в unix с более чем 25 цифрами подряд, но awk обрабатывает значение по умолчанию grep файл из файла сценарий оболочки для чтения из нескольких файлов параллельно Установите разрешения по умолчанию, чтобы только владелец мог читать, выполнять и писать для каждого нового файла и каталога Почему возврат игнорируется во время вывода в bash? Su -c не работает и игнорируется Выполнить команду в фоновом режиме, но также объединить в нее другие команды?

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

Как переименовать все файлы в папке с первым словом их содержимого? Например, если a.txt содержит «Unix – это ОС» ​​в первой строке, тогда a.txt следует переименовать в Unix.txt

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

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 

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

 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 в каждом файле! В противном случае вы можете столкнуться с неожиданными результатами 😉

 for i in *.txt do d="$(head -1 "$i" | cut -d " " -f1).txt"; mv "$i" "$d" done 
 for i in *.txt; do mv "$i" "$(head -1 "$i")".txt; done 

На свой страх и риск: 🙂

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

Это работает с легкими именами файлов, содержащими простые слова. Файл «O'Reilly», содержащийся в качестве первого слова «Это'о», потерпит неудачу. Несчастно.