Com o GNU mv :
find path_A -name '*AAA*' -exec mv -t path_B {} +
Isso usará a -exec
opção find, que substitui o {}
resultado de cada localização por vez e executa o comando que você fornece. Como explicado em man find
:
-exec command ;
Execute command; true if 0 status is returned. All following
arguments to find are taken to be arguments to the command until
an argument consisting of `;' is encountered.
Nesse caso, estamos usando a +
versão -exec
para executarmos o menor número mv
possível de operações:
-exec command {} +
This variant of the -exec action runs the specified command on
the selected files, but the command line is built by appending
each selected file name at the end; the total number of invoca‐
tions of the command will be much less than the number of
matched files. The command line is built in much the same way
that xargs builds its command lines. Only one instance of `{}'
is allowed within the command. The command is executed in the
starting directory.
+
que dows o trabalho, você pode ler a minha citação acima ouman find
em vez-exec mv {} path_b +
e estava falhando com erros de permissão. TBH, eu ainda não entendo o porquê, mas-exec mv -t path_b {} +
funciona um prazer!-exec ... {} +
,{}
tem que ser a última coisa antes da+
. É por isso que ele usamv -t destdir {} +
e nãomv {} destdir +
. Um resfriado foi usado-exec mv {} destdir ';'
, mas isso seria executadomv
uma vez para cada arquivo.Você poderia fazer algo como abaixo também.
Onde,
-0
Se houver espaços em branco ou caracteres (incluindo novas linhas), muitos comandos não funcionarão. Esta opção cuida dos nomes dos arquivos com espaço em branco.-I
Substitua ocorrências de replace-str nos argumentos iniciais pelos nomes lidos na entrada padrão. Além disso, espaços em branco não citados não finalizam itens de entrada; em vez disso, o separador é o caractere de nova linha.Testando
Eu criei dois diretórios como
sourcedir
edestdir
. Agora, eu criei monte de arquivos dentrosourcedir
defile1.bak
,file2.bak
efile3 with spaces.bak
Agora, eu executei o comando como,
Agora, dentro do
destdir
, quando eu façols
, pude ver que os arquivos foram movidos desourcedir
paradestdir
.Referências
http://www.cyberciti.biz/faq/linux-unix-bsd-xargs-construct-argument-lists-utility/
fonte
Para o benefício dos usuários do OS X que se deparam com essa questão, a sintaxe no OS X é um pouco diferente. Supondo que você não deseja procurar recursivamente em subdiretórios de
path_A
:Se você deseja pesquisar todos os arquivos recursivamente em
path_A
:fonte
find
que eu usei. Pontos-maxdepth
positivos : (especialmente se path_B é um subdiretório - evitamv
tentar mover arquivos que já estão lá!) E usar \; (então {} não precisa ser o último parâmetro e amv
sintaxe normal pode ser usada)A
-exec
é a melhor maneira de fazer isso. Se, por qualquer motivo, isso não for uma opção, você também poderá ler os resultados em um loop:Essa é a maneira segura: ele pode lidar com nomes de arquivos que contêm espaços, novas linhas ou outros caracteres estranhos. Uma maneira mais simples, mas que falhará, a menos que os nomes dos arquivos consistam apenas em caracteres alfanuméricos simples , é
Mas use o loop while.
fonte
your file names consist only of simple alphanumeric characters
, por exemplo, se chegarARG_MAX
Usando apenas os recursos POSIX de
find
(e também demv
):Leitura adicional:
fonte
Outra maneira
fonte