Como copiar um arquivo com nome exclusivo sem navegar para o diretório?

5

Digamos que eu tenha um arquivo com um nome exclusivo (por exemplo, Screenshot20180509143013.png) que desejo copiar para / media / SD256.

O arquivo /media/drive1/Users/name/Pictures/Screenshots/Screenshot20180509143013.png está emaranhado em alguns níveis de subdiretórios, e eu desejo não navegar para / media / drive1 / Users / name / Pictures / Screenshots / para encontrar esse arquivo com o nome exclusivo.

Em vez disso, desejo executar um comando enquanto meu diretório de trabalho é / media / drive1 /, que é semelhante a:

copy --find-filename-then-copy Screenshot20180509143*3.png /dev/media/SD256/DestinationFolder

Existe algum comando que possa primeiro encontrar o arquivo e depois copiar?

    
por neverMind9 09.05.2018 / 15:35

3 respostas

14

Usando find :

find . -type f -name Screenshot20180509143013.png -exec cp {} /dev/media/SD256/DestinationFolder ';'

Isso localizaria todos os arquivos regulares dentro ou abaixo do diretório atual, cujos nomes são exatamente Screenshot20180509143013.png . Os arquivos encontrados seriam copiados para /dev/media/SD256/DestinationFolder . Se houver vários arquivos com o mesmo nome (que você diz não existirem), os arquivos se substituirão no diretório de destino.

    
por 09.05.2018 / 15:49
14

Com zsh ou fish ou ksh -o globstar ou bash -O globstar (ou depois de shopt -s globstar em bash ) ou tcsh após set globstar ou yash -o extended-glob :

cp -- **/Screenshot20180509143*3.png /dev/media/SD256/DestinationFolder

globstar, com a sintaxe ** , faz uma pesquisa recursiva; Se o restante do glob (padrão de nome de arquivo) for exclusivo, você obterá os resultados desejados. Observe que copiei o ...3*3 do seu exemplo e não o filename Screenshot20180509143013.png da anterior na questão.

Observe que:

  • fish e versões do bash anteriores a 4.3 seguirão os links simbólicos ao recursing. Com zsh , tcsh ou yash , você pode usar *** em vez de ** para obter esse comportamento.
  • fish não encontrará o arquivo se estiver no diretório atual.
  • Arquivos e arquivos ocultos em diretórios ocultos não serão considerados. Muitos shells têm uma opção dotglob para reativá-los. Veja também o qualificador (D) glob em zsh .
  • Em zsh você também pode querer adicionar ([1]) no final do padrão. [1] é um qualificador de glob para copiar apenas o arquivo de correspondência primeiro .
  • a opção -i para cp também pode proteger contra sobregravação acidental se o arquivo for encontrado em vários diretórios.
por 09.05.2018 / 15:44
2

ZSH

Se você estiver usando zsh , poderá usar cp com zsh de globbing:

cp **/Screenshot20180509143013.png /dev/media/SD256/DestinationFolder

**/Screenshot20180509143013.png tentará encontrar Screenshot20180509143013.png recursivamente no diretório atual.

Propósito geral

Para uso geral, você sempre pode usar find + cp :

cp "$(find ./ -type f -name "<picture_name>" )" "<destination>"

find - Procure um arquivo.

./ - Pesquise no diretório atual.

-type f - Limita a busca pelos arquivos regulares.

-name "<picture_name>" - Procure um arquivo com o nome <picture_name>
( * in <picture_name> pode ser usado para corresponder a qualquer sequência)

"$(find ./ -type f -name "<picture_name>" )" - Substitua esta parte do código pelo comando stdout of find .

cp "$(find ./ -type f -name "<picture_name>" )" <destination> - Copie o arquivo com o caminho obtido de "$(find ./ -type f -name "<picture_name>" )" para <destination> .

    
por 09.05.2018 / 15:44