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