Bash: получить имена файлов из names.txt и назначить их файлам в папке

bash

87 просмотра

4 ответа

Итак, у меня есть папка с именами файлов примерно так:

01
02
03
04
05
...

Я хочу создать bash-скрипт, который просматривает другой документ в той же папке (т.е. names.txt) и назначает имена файлов на основе текстового документа. Так что, если «names.txt» выглядит так:

name1
name2
name3
...

Я хотел бы сценарий bash, который может назначить 'name1' для файла, который в настоящее время называется '01' в папке.

Я все еще новичок в написании сценариев bash, поэтому любая помощь будет принята с благодарностью. Я открыт для вопросов, если что-то нужно прояснить.

Автор: Kasper Siig Источник Размещён: 08.11.2019 11:02

Ответы (4)


1 плюс

Вы можете использовать pasteдля выравнивания ls (stdin) и файла имен (в данном случае из родительского каталога), а затем повторять цикл while, читая результат построчно, по списку и делать свое дело:

ls ?? | sort -n | paste - ../names.txt | while read a b; do mv "$a" "$b"; done

Это предполагает, что имена файлов не имеют специального символа и что число является точным количеством в файле имен.

Автор: eckes Размещён: 20.08.2016 08:05

1 плюс

Попробуйте этот сценарий. Примечание. Перед проверкой сделайте резервную копию вашей папки.

    #!/bin/bash
    ls -I names.txt -I rename.txt -I *.sh > rename.txt
    paste rename.txt names.txt | column -s $'\t' -t > rename_rules.txt
    eval "$(sed 's/^/mv /g' rename_rules.txt )"
    #rm rename.txt rename_rules.txt

Это сработало для меня. Пожалуйста, найдите все шаги ниже.

$ touch 01 02 03 04 05

$ vim names.txt

$ cat names.txt
name1
name2
name3
name4
name5

$ ls
01  02  03  04  05  main.sh  names.txt

$ cat main.sh 
#!/bin/bash
ls -I names.txt -I rename.txt -I *.sh > rename.txt
paste rename.txt names.txt | column -s $'\t' -t > rename_rules.txt
eval "$(sed 's/^/mv /g' rename_rules.txt )"
exit 0;
#rm rename.txt rename_rules.txt

$ sh main.sh

$ ls
main.sh  name1  name2  name3  name4  name5  names.txt  rename.txt rename_rules.txt

$ cat rename_rules.txt
01  name1
02  name2 
03  name3
04  name4
05  name5  

Можете ли вы поделиться своими фактическими именами файлов и содержимым names.txt, чтобы мы могли их отладить?

Автор: Rajiv Размещён: 20.08.2016 09:04

0 плюса

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

for f in [0-9]*; do
  grep -q name"${f#0}" names.txt && mv "$f" name"${f#0}"
done

Для каждого файла , $fсодержащего цифру в текущем каталоге, grepпоиск команды в names.txtтечение строки с nameпоследующим значением $fбез потенциала ведущего нуля: "${f#0}".

Если строка найдена, mvкоманда переименовывает файл с нужным именем.

Автор: SLePort Размещён: 20.08.2016 09:46

0 плюса

Это безопасная версия решения - предполагается, что файлы для переименования находятся в srcdir - он создает переименованные файлы в новом каталоге destdir - удаляет эхо для фактической копии - вы можете изменить cp на mv после проверки правильности переименования

mkdir destdir
ls srcdir|paste - names.txt|
while read srcf destf; do
   echo cp srcdir/$srcf destdir/$destf
done
Автор: pakistanprogrammerclub Размещён: 20.08.2016 04:31
Вопросы из категории :
32x32