Livre-se de caracteres 000A em nomes de arquivos

1

Oqueéessecaractere"não imprimível" chamado para que eu possa usar o termo apropriado para localizar ou perguntar Como removo esse caractere para renomear meu arquivo, removendo-o sem remover nenhum outro caractere de formatação usando um Roteiro BASH?

Este é um script que estou usando, mas não estou obtendo os resultados desejados.

#!/bin/bash

typeset -i count
let count=0

working_dir="/home/userx/temp/"

script_dir="/home/userx/temp/"

MAXFILES="$(find "$working_dir" -type f | wc -l)"

find "$working_dir" -type f | while [[ $count -ne '3' ]] ; 
do read FILENAME;

 w=$FILENAME
 xpath=${w%/*} 
 xbase=${w##*/}
 xfext=${xbase##*.}
 xpref=${xbase%.*}
 path=${xpath}
 pref=${xpref}
 ext=${xfext}

 echo "extions is : $ext" echo

 if [[ "$ext" == 'mp3' ]] ; then

     echo "$ext" echo

     pref=$(tr -dc '[[:print:]]' <<< "$pref")

     ## holds on to normal chars rids the rest

    # pref=${pref//[^A-Za-z&0-9 ]/ }

     echo "new title is -> $pref"
     sleep 2

 #file=${FILENAME##*/}
 # Newfile=${file%_*}

 # echo " mv -v "$working_dir"/"$file" "$working_dir"/"$Newfile" "

(( count++ ))

fi

done 

resulta sendo isso

[userx@voided temp]$ ./Justrenamefiles

max file is : 311
FILENAME IS: /home/userx/temp/Joy Division - Ceremony (Graveyard     Studios, Prestwich - Previously
extions is : Joy Division - Ceremony (Graveyard Studios, Prestwich -     Previously echo
FILENAME IS: unreleased).mp3

extions is : mp3  


**new title is -> unreleased)**

como você pode ver, ele remove muito o nome do arquivo. tentando ambos os metholids que estão no script, um deles é agora comentado, eu ainda não obtenho os resultados desejados.

alguém sabe qual sniplet de código eu posso usar para obter meus resultados desejados?

    
por uxserx-bw 03.09.2016 / 15:39

2 respostas

1

Este gráfico representa o caractere cujo valor Unicode é 000A (em hexadecimal). Este é o caractere de alimentação de linha (LF) , ou seja, uma quebra de linha.

O Linux permite quebras de linha em nomes de arquivos, mas são muito incomuns. É possível manipular nomes de arquivos com quebras de linha em scripts de shell, mas você precisa ter um cuidado especial. Seu script analisa a saída de find e, como essa saída usa novas linhas para separar itens, esse método não pode lidar intrinsicamente com novas linhas em nomes de arquivos.

Seu script é muito mais complicado do que precisa ser. Se você mantiver as coisas simples, funcionará. Como regra geral, aja nos dados quando você os tiver, em vez de compactar tudo em um fluxo de texto e analisá-lo novamente.

Com find , não analise a saída. Use a ação -exec .

A maneira mais simples de fazer isso renomear (eu substituirei as novas linhas por espaços) é com zsh , graças a sua % funçãozmv .

autoload -U zmv   # put this in your .zshrc
cd $working_dir
zmv '**/*' $'${f//\n/ }'

Se você realmente precisa se ater a programas que são sempre pré-instalados em Linux não embarcado, aqui está um método simples (se um pouco lento) que depende do bash para renomear:

find "$working_dir" -type f -name '*
*' -exec bash -c 'mv "$0" "${0//
/ }"' {} \;

Você pode acelerar isso invocando o bash em lotes de arquivos:

find "$working_dir" -type f -name '
' -exec bash -c 'for x; do mv "$x" "${x//
/ }"' _ {} +

Se houver uma única nova linha no Linux, você pode usar o rename comando (chamado rename.ul no Debian e derivados).

find "$working_dir" -type f -name '
' -exec rename '
' ' ' {} +

Se você tiver prename :

find "$working_dir" -type f -name '
' -exec prename 'y/\n/ /' {} +
    
por 04.09.2016 / 01:51
0

O problema é que seus nomes de arquivos contêm uma nova linha, por exemplo, aaa\nbbb , e seu método find | read não pode distinguir isso de dois arquivos, aaa e bbb .

A resposta usual para isso é obter find para separar nomes de arquivos com o caractere nul find -print0 usando IFS= read -r -d '' FILENAME e, em seguida, usando -d '' para ler este fluxo de entrada. O -r diz para a leitura usar o caractere nul como delimitador de linha, IFS= para o processamento de barra invertida e %code% preserva espaços em branco no início e no fim.

    
por 03.09.2016 / 20:32