Renomeie os arquivos cortando o '\ n' no final do nome deles

1

Eu fiz um script python para analisar um grande volume de alguns dados e salvar os resultados que acabaram produzindo ~ 162 arquivos. O script nomeou esses arquivos Parsed_NameOfOriginal\n . Observe o \n no final que não foi planejado, mas foi adicionado de alguma forma pelo meu script. Como demorou muitas horas para produzir esses resultados, não quero executar o script fixo novamente.

Existe uma maneira de usar o Linux Terminal ou um shell script para renomear cada arquivo em um diretório com o mesmo nome, mas cortando \n no final?

Ou seja. Parsed_ResultA\n se torna Parsed_ResultA .

Nota: é o novo caractere de linha que foi adicionado e não um texto \n

    
por user2018084 09.02.2014 / 16:54

3 respostas

4

Isso deve funcionar:

for f in *$'\n'; do mv -i "$f" "${f%$'\n'}"; done
  • *$'\n' se expande para todos os nomes de arquivos que terminam em um caractere de nova linha.

  • O loop for passa por todos os arquivos correspondentes, salvando o nome do arquivo na variável f .

  • ${f%$'\n'} retira o caractere de nova linha do nome do arquivo armazenado em f .

  • mv -i renomeia o arquivo, perguntando se ele sobrescreveria alguma coisa.

por 09.02.2014 / 17:09
0

Você pode usar o rename perl do pacote debian libfile-rename-perl :

rename 's/\n//' Parsed_Result*

Como existem vários sabores de rename por aí, faça um backup de seus arquivos antes.

    
por 09.02.2014 / 17:09
0

OK, OK, minha nova variante:

$ touch boo$'\n'
$ touch foo$'\n'
$ ls -l
total 4
-rw-r--r-- 1 user user 54 Feb  9 12:16 111.sh
-rw-r--r-- 1 user user  0 Feb  9 12:17 boo?
-rw-r--r-- 1 user user  0 Feb  9 12:17 foo?
$ sh 111.sh 
$ ls -l
total 4
-rw-r--r-- 1 user user 54 Feb  9 12:16 111.sh
-rw-r--r-- 1 user user  0 Feb  9 12:17 boo
-rw-r--r-- 1 user user  0 Feb  9 12:17 foo
$ cat 111.sh 
for i in 'find ./ -name '*
''
do
  mv $i$'\n' $i
done
$

Variante antiga (errada):

Uso:

find ./ -name "*\n" | sed 's/\(.*\)\n/mv \\n\ /'

para criar lista de comandos de renomeação. E então basta copiar / colar todos esses comandos para o terminal. Exemplo:

$ touch 111\n
$ touch 222\n
$ ls -l
total 0
-rw-r--r-- 1 user user 0 Feb  9 11:15 111\n
-rw-r--r-- 1 user user 0 Feb  9 11:15 222\n
$ find ./ -name "*\n" | sed 's/\(.*\)\n/mv \\n\ /'
mv ./111\n ./111
mv ./222\n ./222
$ mv ./111\n ./111
$ mv ./222\n ./222
$ ls -l
total 0
-rw-r--r-- 1 user user 0 Feb  9 11:15 111 
-rw-r--r-- 1 user user 0 Feb  9 11:15 222 
$   
    
por 09.02.2014 / 17:22

Tags