Substituir barras em um nome de arquivo

4

Portanto, preciso escrever um script bash que copie todos os arquivos para um diretório especificado, mas preciso renomear os arquivos para seu caminho absoluto, substituindo o caractere / por __ .

Por exemplo, se o arquivo zad1.sh estiver no diretório /home/123456/ , o arquivo precisará ser renomeado para __home__123456__zad1.sh

Alguma ideia de como fazer isso?

    
por David Mathers 14.06.2018 / 17:27

4 respostas

-1

A abordagem clássica seria usar sed:

cp "${filename}" "$(realpath ${filename} | sed s:/:__:g)"

A vantagem é principalmente portabilidade através de shells se você não necessariamente sempre usará o bash.

Claro, isso também permite que você renuncie ao script e apenas o faça com find:

find /base/path -type f -exec cp \{\} 'realpath \{\} | sed s:/:__:g' \;

O Find tem opções de classificação e filtragem que você pode usar se precisar delas para copiar apenas determinados arquivos.

edit: Essa configuração de localização funciona em um dos meus sistemas, mas não no outro. Em vez de resolver a diferença, apenas tornei mais portátil:

find /base/path -type f | sed -e "p; s:/:__:g" | xargs -n2 cp
    
por 14.06.2018 / 20:10
11

Para obter o caminho do seu arquivo:

realpath <file>

Substituir no bash:

echo "${var//search/replace}"

As duas primeiras barras são para fazer uma pesquisa global. Usando apenas / só faria uma substituição.

Então, seu código pode ser

path=$(realpath zad1.sh)
path_replaced=${path//\//__}
    
por 14.06.2018 / 17:36
6

Eu acredito que isso vai conseguir o que você está perguntando:

#!/bin/bash

_from_dir=/path/to/files
_to_dir=/path/to/dest

for file in "${_from_dir}/"*; do
    nfile="$(sed 's#/#__#g' <<<"$file")"
    cp "$file" "${_to_dir}/$nfile"
done

Defina a variável _from_dir para o caminho onde os arquivos estão localizados e a variável _to_dir para o caminho em que você deseja que eles sejam copiados.

O loop passará por cada arquivo no local _from_dir . nfile tomará o caminho completo do arquivo e substituirá / por __ . Em seguida, será cp o arquivo no caminho _to_dir com um nome representando o caminho completo de sua origem.

    
por 14.06.2018 / 17:36
0

Eu fiz pelo método abaixo

ls -ltr /root/l.txt| awk '{print "cp" " " $NF,$NF}'| awk '{gsub("/","_",$NF);print $1,$2,"/root/p1/"$3}'| sh

Aqui, o arquivo /root/l.txt será copiado para / root / p1 / path, mas o nome do arquivo será _root_l.txt. Deixe-me saber qualquer confusão

Here /root/p1==> destination path
    
por 15.06.2018 / 05:01