renomeá-los, como? Se você substituir o delimitador de diretório por algo - digamos sublinhado (_), você poderá obter colisões com arquivos, que já contêm um sublinhado. Isso é verdade para todos os caracteres válidos e, ao lado de / e \ 0, que são proibidos em nomes de arquivos, não há porto seguro - qualquer personagem pode causar uma colisão.
usuário desconhecido
As pastas têm subpastas ou apenas uma estrutura de pastas ampla e simples?
usuário desconhecido
Respostas:
8
Aqui está:
for file in/home/user/temps/*/thumb.png;do new_file=${file/temps/new_folder}; cp "$file""${new_file/\/thumb/}";done;
editar:
a sabedoria canônica, a propósito, é que usar findpara isso é uma péssima idéia - simplesmente usar expansão de shell é muito mais confiável. Além disso, isso pressupõe bash, mas acho que é uma suposição segura :)
editar 2:
para maior clareza, eu vou detalhar:
# shell-expansion to loop specified filesfor file in/home/user/temps/*/thumb.png;do# replace 'temps' with 'new_folder' in the path# '/home/temps/abc/thumb.png' becomes '/home/new_folder/abc/thumb.png'
new_file=${file/temps/new_folder};# drop '/thumb' from the path# '/home/new_folder/abc/thumb.png' becomes '/home/new_folder/abc.png'
cp "$file""${new_file/\/thumb/}";done;
detalhes sobre a ${var/Pattern/Replacement}construção podem ser encontrados aqui .
as aspas na cplinha são importantes para manipular espaços e novas linhas etc. nos nomes de arquivos.
new_file = new_folder? Qual é o objetivo da barra invertida na frente da barra new_file/\/thumb?
usuário desconhecido
11
@user: ${VARIABLE/PATTTERN/REPLACEMENT}produz o valor de VARIABLEmas com o padrão é substituído pelo texto de substituição. Aqui está o padrão /thumb(as /necessidades precisam ser escapadas para que não pareçam ${new_file//PATTERN/REPLACEMENT}, o que a torna uma substituição global em vez de uma substituição de primeira ocorrência) e o texto de substituição está vazio.
Gilles 'SO- stop be evil'
Claro, agora eu vejo. :)
usuário desconhecido
11
Você está assumindo que os 487 diretórios estão diretamente abaixo /home/user/temps, o que não está claro na pergunta. Se não estiverem, você precisa encontrar ou **.
Gilles 'SO- stop be evil'
@ Gilles - De fato, é assim que leio a pergunta. Apreciar o momento, embora :)
simon
5
Isso funciona para subdiretórios arbitrariamente profundos:
A parte interessante é a expansão dos parâmetros${NAME//\//_} . Ele pega o conteúdo de NAMEe substitui cada ocorrência de /por _.
Nota: o resultado depende do diretório de trabalho e do parâmetro do caminho para localização. Eu executei o comando no diretório pai de temps. Substitua cppor echopara experimentar.
Falha nos arquivos que contêm uma nova linha em seu nome.
usuário desconhecido
Bem, isso funcionou muito bem. mais uma coisa, eu tenho alguns arquivos zip em alguns subdiretórios também. é possível extrair imgas de lá também. lembre-se 'não zip teor de alcatrão'
mkdir /home/user/thumbs
targDir=/home/user/thumbs
cd /home/user/temps
find .-type d |while IFS="" read -r dir ;doif[[-f "${dir}"/thumb.png ]];then
echo mv -i "${dir}/thumb.png""${targDir}/${dir}_thumb.png"fidone
Editar
Eu adicionei citações caso algum de seus nomes de diretório possua caracteres de espaço em branco incorporados.
Também mudei isso para que apenas imprima os comandos a serem executados. Examine a saída do script para garantir que todos os nomes de arquivos / caminhos pareçam adequados. Quando tiver certeza de que não há problemas com os comandos que serão executados, remova o echo.
Eu tenho alguns arquivos png em mais algumas subpastas, isso funcionará
Mirage
para minha mv -i ./A A/thumb.png ../tmp/.pngpasta "A A", ela produz: - todos os arquivos terminam em ../tmp/.png (../tmp é o meu diretório de destino).
usuário desconhecido
Adicionar citações e chaves em torno de todas as variáveis no código acima, ou seja, "$ {dir}"
shellter
@ Mirror51 escreveu: "arquivos em mais algumas subpastas, isso funcionará". Sim deveria. Você sabia que pode executar cada etapa deste script separadamente (ou quando canalizadas juntas, cada conjunto de tubulações). Você pode executar apenas o find -type de ver a saída. Isso obtém todos os diretórios que você espera? Caso contrário, adicione alguma saída para mostrar o problema. Boa sorte.
precisa saber é o seguinte
Não vai funcionar. read direxecuta a divisão de palavras e recebe, de um diretório a\nbaeb como duas instâncias, que nenhuma máscara pode resolver.
usuário desconhecido
-1
Para copiar, você precisa do comando cp , e renomear para linux é o mesmo que mover o arquivo, então você deve fazê-lo com o comando mv . No Linux, você sempre precisa especificar o caminho inteiro, desde a origem, se estiver em outra pasta, até a pasta de destino, é claro. Eu seria algo assim, para cópia:
Respostas:
Aqui está:
editar:
a sabedoria canônica, a propósito, é que usar
find
para isso é uma péssima idéia - simplesmente usar expansão de shell é muito mais confiável. Além disso, isso pressupõebash
, mas acho que é uma suposição segura :)editar 2:
para maior clareza, eu vou detalhar:
detalhes sobre a
${var/Pattern/Replacement}
construção podem ser encontrados aqui .as aspas na
cp
linha são importantes para manipular espaços e novas linhas etc. nos nomes de arquivos.fonte
new_file/\/thumb
?${VARIABLE/PATTTERN/REPLACEMENT}
produz o valor deVARIABLE
mas com o padrão é substituído pelo texto de substituição. Aqui está o padrão/thumb
(as/
necessidades precisam ser escapadas para que não pareçam${new_file//PATTERN/REPLACEMENT}
, o que a torna uma substituição global em vez de uma substituição de primeira ocorrência) e o texto de substituição está vazio./home/user/temps
, o que não está claro na pergunta. Se não estiverem, você precisa encontrar ou**
.Isso funciona para subdiretórios arbitrariamente profundos:
A parte interessante é a expansão dos parâmetros
${NAME//\//_}
. Ele pega o conteúdo deNAME
e substitui cada ocorrência de/
por_
.Nota: o resultado depende do diretório de trabalho e do parâmetro do caminho para localização. Eu executei o comando no diretório pai de temps. Substitua
cp
porecho
para experimentar.fonte
Código auxiliar curto:
vamos chamá-lo de 'deslash.sh' e torná-lo executável. Ligue com:
Falhará, se houver uma colisão
mas isso é inevitável.
fonte
Tente isto
Editar
Eu adicionei citações caso algum de seus nomes de diretório possua caracteres de espaço em branco incorporados.
Também mudei isso para que apenas imprima os comandos a serem executados. Examine a saída do script para garantir que todos os nomes de arquivos / caminhos pareçam adequados. Quando tiver certeza de que não há problemas com os comandos que serão executados, remova o
echo
.fonte
mv -i ./A A/thumb.png ../tmp/.png
pasta "A A", ela produz: - todos os arquivos terminam em ../tmp/.png (../tmp é o meu diretório de destino).find -type d
e ver a saída. Isso obtém todos os diretórios que você espera? Caso contrário, adicione alguma saída para mostrar o problema. Boa sorte.read dir
executa a divisão de palavras e recebe, de um diretórioa\nb
aeb como duas instâncias, que nenhuma máscara pode resolver.Para copiar, você precisa do comando cp , e renomear para linux é o mesmo que mover o arquivo, então você deve fazê-lo com o comando mv . No Linux, você sempre precisa especificar o caminho inteiro, desde a origem, se estiver em outra pasta, até a pasta de destino, é claro. Eu seria algo assim, para cópia:
ou renomear ou mover
fonte
find