chown hadoop:hadoop ChownFileNames*
Estou tentando colocar todos os arquivos cujos nomes de arquivos começam com ChownFileNames
. Eu usei esse comando, mas parece que não funciona:
find . -maxdepth 1 |grep 'ChownFileNames*' -exec chown hadoop:hadoop -- {} . \;
O que estou fazendo de errado?
Isso deve funcionar para o que você precisa:
find . -maxdepth 1 -iname 'ChownFileNames*' -exec chown hadoop:hadoop -- {} . \;
O símbolo |
("pipe") significa passar a saída do comando à esquerda para o comando à direita. O comando find . -maxdepth 1
lista os arquivos no diretório atual (mais .
em si). O comando grep 'ChownFileNames*' -exec chown hadoop:hadoop -- {} . \;
não faz sentido: você está passando find
options para o comando grep
.
find
em si tem uma maneira de combinar nomes de arquivos, o predicado -name
. É necessário um padrão curinga de shell como argumento.
Você pode usar grep
para filtrar a lista, mas precisará fornecer uma linha de comando válida para grep
. Para reter apenas os nomes de arquivo que correspondem ao padrão de shell ChownFileNames*
, você precisaria usar a expressão regular /ChownFileNames[^/]$
. Em seguida, você teria que analisar a saída de grep
para transformar a lista de nomes correspondentes em argumentos de linha de comando. Supondo que você esteja executando o Linux e os nomes de arquivos não contenham novas linhas, você pode usar xargs
:
find . -maxdepth 1 |
grep '/ChownFileNames[^/]*$' |
xargs -d '\n' chown hadoop:hadoop
É muito mais simples e mais robusto usar a ação find
do -exec
. Observe que você pode usar -exec … {} +
para executar o comando de um lote de arquivos de uma só vez, em vez de uma vez por arquivo. Você também pode fazer find
listar o diretório atual.
find . maxdepth 1 \( -name . -o -name 'ChownFileNames*' \) -exec chown hadoop:hadoop {} +
Normalmente, não há sentido em executar find
quando você só está combinando arquivos pelo nome (e não por data) no diretório atual (sem subdiretórios). A menos que haja tantos arquivos no diretório atual que isso torne a linha de comando muito longa, apenas use
chown hadoop:hadoop . ChownFileNames*
Por favor, dê uma olhada nas opções -name
ou -iname
em find(1)