Como mover apenas arquivos no Unix

18

Como posso mover apenas os arquivos simples (não os diretórios) de uma pasta no Linux para outra pasta usando o mvcomando?

Eu tentei mv * ~/, mas ele copiou tudo, incluindo os diretórios.

Scott
fonte
seus comentários mencionam uma restrição adicional: o comando não deve mover arquivos ocultos do diretório de trabalho atual. se estiver correto, você poderia editar sua pergunta para mencionar isso? dizer "mover apenas arquivos" nos faz pensar em "mover todos os arquivos", o que inclui arquivos ocultos.
quack quixote

Respostas:

29

Podes tentar

find . -maxdepth 1 -type f -exec mv {} destination_path \;
Mereghost
fonte
2
Uau, alguém que sabe usar o find. Para completar, você deve usar -name [^.] * Na busca, ou seja, --- encontrar. -maxdepth 1 -type f -name [^.] * -exec mv {} caminho \;
chris
NÃO COPIE-COLAR ISTO EM SUA CASCA. O ponto e vírgula fará com que seja executado imediatamente. :)
Sherwood Callaway
@SherwoodCallaway O ponto-e-vírgula é para marcar o final de-exec
dstonek 19/10/19
4

Eu sou do tipo "use um martelo para tudo", então eu uso programas de shell bourne para coisas que outros usam programas externos para ...

for file in * .* 
do
  test -f "$file" && mv "$file" "$HOME"/
done

Algumas pessoas gostam de fazer as coisas com a menor digitação possível, mas eu sou uma datilógrafa bem rápida e tenho coisas assim embutidas no meu cérebro, então não é muito doloroso fazer isso em vez de procurar exatamente argumentos para encontrar e exec e tudo isso.

YMMV, no entanto ...

chris
fonte
obrigado por isso vou tentar. mas ainda preciso da outra resposta, porque é para um projeto que estou fazendo no curso linux. muito obrigado
11
Esta é uma resposta para sua pergunta. O mv não tem conhecimento de arquivos ou diretórios, fifos ou outros arquivos especiais. O mv entende apenas entradas e inodes de diretório e, no que diz respeito, elas são todas iguais, independentemente do tipo de arquivo. Para permitir que o mv mova apenas um tipo específico de arquivo, você precisa de algo como teste ou descoberta que possa realmente olhar o inode para ver qual é o arquivo. Em outras palavras, você está sendo questionado se você está sendo solicitado a fazê-lo apenas com mv.
chris
11
E eu digo que mv entende inodes apenas porque é capaz de mover um arquivo de um sistema de arquivos para outro, que é tecnicamente um cp, em seguida, um rm, não um mv (que é realmente apenas um ln então rm). Procure hardlinks e entradas de diretório.
chris
2
baixinha: Esta é uma boa resposta, você precisa usar algo além do comando mv (pelo menos o shell). Isso é básico, pois fica sem programação.
Kyle Brandt
3

@Mereghost está muito perto. Aqui está o que eu consigo mover todos os arquivos (incluindo arquivos ocultos), mas não os diretórios:

find . -maxdepth 1 -type f -name '*' -exec mv -n {} /destination_path \;

A .localização posterior assume que o diretório atual é a fonte dos arquivos que você deseja mover. Caso contrário, o comando pode ser revisado, da seguinte maneira:

find /source_path -maxdepth 1 -type f -name '*' -exec mv -n {} /dest_path \;

Se você deseja mover apenas arquivos regulares e não arquivos ocultos:

find . -maxdepth 1 -type f -name '[!.]*' -exec mv -n {} /dest_path \;

Se você deseja mover apenas arquivos ocultos e não regulares:

find . -maxdepth 1 -type f -name '.*' -exec mv -n {} /dest_path \;
teancum144
fonte
0

Se você não possui pastas com nome com ponto, pode movê-las simplesmente:

mv . ~ / pasta de destino

(Minha suposição é de que todos os seus arquivos são algo. Algo (no meu caso, todos são geralmente))

MAS, graças a outras respostas - muito útil. valeu

Shawor
fonte
-1

você pode usar o find

find * -maxdepth 1 -type f -exec mv {} ~ \;
John T
fonte
Sim, bem, que funcionou, mas não 100%, copiou todos os arquivos dos diretórios e subdiretórios para ~ / local. Eu preciso de algo muito básico que copie os arquivos sem os arquivos ocultos do diretório em que estou para outro diretório. é isso aí. obrigado pelo conselho de qualquer maneira
Isso é impossível com maxdepth como 1.
John T
corrigido para não copiar arquivos ocultos.
John T
11
A sintaxe na busca é encontrar, em seguida, um diretório e uma descrição das operações e itens a serem correspondidos. Um normalmente nunca usar tal curinga como find * sem protegendo-o de englobamento (ou seja, encontrar / path / to / directory -name goo * -type f.
chris
11
Localizar só funciona corretamente se você entregar um único caminho para examinar. No seu exemplo, por exemplo, se houver algum arquivo que comece com um - find explodirá inesperadamente. Você é sempre muito melhor tendo apenas um programa lendo a entrada de diretório e, no seu exemplo, você está meio que usando dois programas diferentes (find e shell).
chris
-2

mv `find ./sourcedir/* -type f` ./destdir

Cm57201
fonte
2
Isso falhará para qualquer arquivo que contenha espaço em branco em seu nome. A saída dos comandos que imprimem nomes de arquivos nunca deve ser analisada, a menos que seja garantido que seja delimitado corretamente. Veja Por que você não deve analisar a saída de ls (1) para a idéia principal. Usar finda -execopção é a melhor maneira de evitar o problema.
slhck