Como mover apenas os arquivos da pasta atual para uma subpasta?

9

Não preciso mover as pastas, apenas os arquivos.

Eu tentei, mv *mas este comando move as pastas também.

Archit
fonte

Respostas:

13

Se você deseja mover tudo, exceto os diretórios, de $SOURCE_DIRpara $TARGET_DIR, você pode usar este comando:

find "$SOURCE_DIR" -maxdepth 1 -not -type d -exec mv -t "$TARGET_DIR" -- '{}' +

Explicado em detalhes:

  • find: A pesquisa de busca de arquivos em um diretório
  • $SOURCE_DIR: O diretório para pesquisar
  • -maxdepth 1: Não olhe dentro dos subdiretórios
  • -not -type d: Ignorar diretórios
    • Você também pode usar -type fse quiser copiar apenas arquivos estritamente, mas eu prefiro o acima, porque também captura tudo o que não é um arquivo nem um diretório (em particular links simbólicos)
  • -exec mv -t "$TARGET_DIR" -- '{}' +: Execute o comando mv -t "$TARGET_DIR" -- FILES...onde FILES...estão todos os arquivos correspondentes (obrigado @DavidFoerster)
Frxstrem
fonte
2
find ... -exec mv -t "$TARGET_DIR" -- '{}' +seria mais seguro (caso $TARGET_DIRnão exista um diretório ou a partida comece -) e mais eficiente (porque não gera um novo subprocesso para cada arquivo correspondente).
precisa
Graças @DavidFoerster, atualizado (também aprendeu algo novo hoje!)
Frxstrem
5

Eu acho que você deseja mv apenas seus arquivos. Primeiro, vá para o diretório e use este comando, substitua $ TARGET pelo caminho do diretório de destino. Se você deseja copiar seus arquivos, substitua mvpor cp.

find . -type f -exec mv {} $TARGET \;

se eu explicar isso, find . -type fsignifica selecionar todos os arquivos e -exec mv {} $TARGET \;executar mvcomando para todos os itens selecionados.


A resposta anterior tem um erro. mvTodos os arquivos dentro dos subdiretórios também. A solução rápida é o uso -maxdepth 1. Em seguida, não recursivamente mvarquivos dentro de subdiretórios. Abaixo está o correto ..

find . -maxdepth 1 -type f -exec mv {} $TARGET \;
Emalsha Rasad
fonte
Eu não acho que o interlocutor queira isso! Ele também moveria todos os arquivos em quaisquer subdiretórios para o mesmo diretório de destino. O -type fnão impede a recursão.
Martin Thornton
@MartinThornton obrigado por sua sugestão .. eu vou editar a minha resposta ...
Emalsha Rasad
3

Abordagem Python

Ao lidar com arquivos recursivamente, findé o caminho a percorrer. Nesse caso em particular, não é necessário, mas pode ser usado com -maxdepth 1outras respostas.

O comando python simples também pode fazê-lo. Aqui está um exemplo:

$ tree
.
├── a_directory
└── a_file

$ python -c "import os,shutil;fl=[f for f in os.listdir('.') if os.path.isfile(f)];                                      
> map(lambda x:shutil.move(x,'./a_directory'),fl)"

$ tree
.
└── a_directory
    └── a_file

1 directory, 1 file

Como isso funciona:

  • fl=[f for f in os.listdir('.') if os.path.isfile(f)]itera sobre todos os itens os.listdir('.')encontrados e testamos se o item é um arquivo usando a os.path.isfile()função

  • Depois flque a lista de arquivos é criada, usamos a map()função Essa função usa dois argumentos - uma função e uma lista de itens; ele executará a função que atribuímos a cada arquivo em uma lista. Portanto, aqui temos a lambda x:shutil.move(x,'./a_directory')função anônima que moverá um arquivo para um diretório e, em seguida, temos fla lista de arquivos que construímos.

Para legibilidade e uso geral, também poderíamos reescrever isso como um script python geral, que recebe dois argumentos - diretório de origem e subdiretório de destino.

#!/usr/bin/env python3
from os import listdir
from os.path import isfile,realpath
from os.path import join as joinpath
from shutil import move
from sys import argv

# this is script's full path
script=realpath(__file__)
# get all items in a given directory as list of full paths
fl=[ joinpath(argv[1],f) for f in listdir(argv[1]) ] 
# filter out script itself ( just in case) and directories
fl_filtered = [ f for f in fl if isfile(f) and not script == realpath(f) ]
# Uncomment this in case you want to see the list of files to be moved
# print(fl_filtered)
# move the list of files to the given destination
for i in fl_filtered:
     move(i,argv[2])

E o uso é assim:

$ tree
.
├── a_directory
├── a_file
└── files2subdir.py

1 directory, 2 files

# Notice: the script produces no output unless you uncomment print statement
$ ./files2subdir.py "." "./a_directory"                                                                                  

$ tree
.
├── a_directory
│   └── a_file
└── files2subdir.py
Sergiy Kolodyazhnyy
fonte
Aqui está outra abordagem Python
jfs
3

Se você estiver usando zsh em vez de bash, poderá fazer o seguinte:

mv "$SOURCE"/*(.) "$TARGET"

O (.)no final é chamado de qualificador glob; o .interior significa especificamente corresponder apenas aos arquivos regulares.

Fazer um mv *(.) "$target"é rápido e prático. No entanto, se você estiver fazendo isso como parte de um script, considere escrever algo como o que Frxstrem e David Forester sugeriram mv -t "$target" -- *(.), para lidar melhor com casos de canto que podem surgir no uso de outras pessoas.

JoL
fonte
11
Como David Forester apontou na minha resposta, mv -t "$TARGET" -- "$SOURCE"/*(.)seria mais seguro (no caso de "$TARGET"começar com -um diretório ou não). Eu gosto da solução zsh!
Frxstrem 01/04
2

Para mover tudo, exceto os diretórios de source-dirdiretório para destination-dirdiretório, no Python:

#!/usr/bin/env python3
"""Usage: mv-files <source-dir> <destination-dir>"""
import shutil
import sys
from pathlib import Path

if len(sys.argv) != 3:
    sys.exit(__doc__)  # print usage & exit 1
src_dir, dest_dir = map(Path, sys.argv[1:])
for path in src_dir.iterdir():
    if not path.is_dir():
        shutil.move(str(path), str(dest_dir / path.name))

Consulte Executando arquivo Python no terminal .

jfs
fonte
@SergiyKolodyazhnyy Não vejo tal exigência em pep-8 e (de acordo com o exemplo lá) na verdade é exatamente o oposto: import mypackageantesfrom mypackage import ...
jfs
@SergiyKolodyazhnyy não confunda as from __future__importações especiais e as from pathlibimportações comuns .
jfs
Sim, parece que eu interpretei errado essa parte. Não, você está certo, import moduledeve ser o primeiro (que é importações partido biblioteca e terceiros) from module import objectdeve ser passado (específica local / biblioteca)
Sergiy Kolodyazhnyy
0

Eu usaria

mv *.*

isso funcionará desde que suas pastas não tenham extensões.


fonte