Estou tentando encontrar todos os arquivos que estão dentro de diretórios cujos nomes começam com 80s
.
ls 80s*/*
encontra os arquivos corretos, mas find . -ipath '80s*/*'
não retorna nada. Qual é o comando correto find
para esta tarefa?
Eu preciso usar find
, pois quero mover todos esses arquivos para uma pasta diferente e não quero analisar a saída de arquivos ls
.
-ipath
corresponde ao nome completo do caminho, incluindo o caminho atual.
. Então você terá que incluir isso no seu padrão:O acima também produzirá diretórios. Para listar apenas arquivos regulares, use:
(ou
! -type d
para qualquer tipo de arquivo exceto diretórios)Se, como você diz,
80s*/*
corresponder aos arquivos corretos, não vejo motivo para usarfind
.Para mover todos os nomes correspondentes
80s*/*
a algum diretório de destinodestdir
, você pode usarIsso move todos os nomes não ocultos de qualquer diretório correspondente
80s*
para o diretório únicodestdir
. A opção não padrão-n
geralmente significa "sem clobber", ou seja, não sobrescreva arquivos se houver colisões de nomes.Se estiver usando GNU
mv
, você também pode evitar sobrescrever arquivos que tenham os mesmos nomes de outros arquivos usando a--backup
opção (por exemplo,--backup=numbered
), ou, como acima,-n
(--no-clobber
).Se você precisar escolher apenas arquivos regulares
80s*/*
ou se expandir para uma lista de nomes muito longa, use um loop:(Isso também moveria links simbólicos para arquivos regulares. Para evitá-los, teste adicionalmente com
-h
/-L
se"$name"
é um link simbólico ou não.)No
zsh
shell, você pode mover todos os arquivos regulares que correspondem ao seu padrão usando... onde o qualificador glob
(.)
filtra os resultados do padrão anterior para conter apenas arquivos regulares ((-.)
para incluir também links simbólicos para arquivos regulares).Se você realmente precisa usar
find
, então considereIsso corresponde aos nomes em que você está interessado e evita nomes ocultos (você disse
80s*/*
correspondências corretamente e presumo que isso significa que nomes ocultos não são desejados). Ele remove todos os nomes correspondentes, o que significa que evita inserir subdiretórios que correspondam ao padrão e, se o nome corresponder a um arquivo normal, move o arquivo paradestdir
usomv -n
como antes.Com o GNU
mv
, você pode torná-lo um pouco mais eficiente usando-exec mv -n -t destdir/ {} +
no lugar do original-exec
. Isso seria executadomv
com lotes de nomes de arquivos encontrados em vez de chamarmv
uma vez para cada nome.