Como mover Somente os arquivos na pasta atual para uma subpasta?

9

Eu não tenho que mover as pastas, apenas os arquivos.

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

    
por Archit 01.04.2017 / 12:22

6 respostas

12

Se você quiser mover tudo, exceto os diretórios de $SOURCE_DIR para $TARGET_DIR , use este comando:

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

Explicado em detalhes:

  • find : A busca por arquivos em um diretório
  • $SOURCE_DIR : o diretório para pesquisar em
  • -maxdepth 1 : não olhe dentro dos subdiretórios
  • -not -type d : ignorar diretórios
    • Você também pode usar -type f se quiser apenas copiar coisas que são estritamente arquivos, mas eu prefiro o acima porque ele 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... são todos os arquivos correspondentes (obrigado @DavidFoerster)
por Frxstrem 01.04.2017 / 12:29
5

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

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

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

A resposta anterior tem um erro .. ele mv todos os arquivos dentro dos subdiretórios também. A correção rápida é usar -maxdepth 1 . Então não recursivamente mv arquivos dentro de sub-diretórios. Abaixo está o correto ..

find . -maxdepth 1 -type f -exec mv {} $TARGET \;
    
por Emalsha Rasad 01.04.2017 / 13:08
3

abordagem Python

Ao lidar com arquivos de forma recursiva, find é o caminho a percorrer. Neste caso em particular, não é necessário, mas pode ser usado com -maxdepth 1 , como mostram outras respostas.

O comando python simples também pode fazer isso. 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)] reúne todos os itens que os.listdir('.') encontra e testamos se o item é um arquivo usando a função os.path.isfile() .

  • Quando a lista de arquivos fl é criada, usamos a função map() . Esta função leva dois argumentos - uma função e uma lista de itens; ele executará a função que fornecemos por cada arquivo em uma lista. Portanto, aqui temos lambda x:shutil.move(x,'./a_directory') como função anônima que moverá um determinado arquivo para um determinado diretório e, em seguida, temos o fl - a lista de arquivos que construímos.

Para facilitar a leitura e o uso geral, podemos também reescrevê-lo 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
    
por Sergiy Kolodyazhnyy 01.04.2017 / 16:44
3

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

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

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

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

    
por JoL 01.04.2017 / 18:32
2

Para mover tudo, exceto os diretórios do diretório source-dir para o diretório destination-dir , em 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))

Veja Executando o arquivo Python no terminal .

    
por jfs 02.04.2017 / 06:52
0

Eu usaria

mv *.*

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

    
por user669400 16.06.2017 / 20:29