Estou copiando arquivos da pasta src para a pasta dest usando o comando:
cp -nv /src/* /dest/ > copy_result.txt
O resultado dos arquivos copiados está no arquivo de saída conforme mostrado abaixo:
« /src/test1.txt » -> « /dest/test1.txt »
« /src/test2.txt » -> « /dest/test2.txt »
Caso contrário, quero que o arquivo de saída contenha apenas o nome do arquivo, sem o caminho completo e sem a extensão do arquivo, assim:
test1
test2
Tente o comando
awk
imprime o sexto campo. Erev
inverte a string.cut
divide a string em um delimitador especificado por-d
, extrai a parte especificada por-f
.Edit:
Conforme apontado, isso não é amigável com arquivos/diretórios com espaços. Mas isso irá extrair substrings entre '-> « ' e ' »' :
-v
não é especificado pelo POSIX. Isso significa que cadacp
implementação pode lidar com isso de maneira diferente (ou não). Onde o seucp
diz o« foo »
meu diz'foo'
. É possível criar um comando que transforme sua saída indesejada na desejada, mas gostaria de apresentar uma solução independente dacp
implementação.Depois que
/src/*
seu comando expande,cp
copia as entradas resultantes uma a uma. Isso significa que você pode se transformarcp -n /src/* /dest/
emAgora é fácil fazer algo com
$file
. Isso irá gerar a saída que você deseja:(Para redirecionar para
copy_result.txt
usardone > copy_result.txt
em vez de apenasdone
).Observe se você usou
cp -r -v
e pelo menos um dos operandos da expansão de/src/*
era um diretório,cp
copiaria e imprimiria seu conteúdo, enquanto o código acima (depois de adicionarmos-r
) copiaria tanto, mas imprimiria apenas o próprio diretório.-r
pode não ser a única opção que introduziria discrepância.Portanto, embora a abordagem deva ser independente da
cp
implementação, ela depende de algumas opções que não estão sendo usadas. Outra desvantagem é que o código executa umcp
processo separado para cada objeto em/src/
, o que está longe de ser o ideal.Há também uma condição de corrida: se o
$dst
arquivo aparecer entre[
ecp
,cp
fará seu trabalho. Você pode usarcp -n
para evitar a substituição, masprintf
ainda relatará o arquivo.