Estou tentando atualizar os carimbos de data e hora de todas as pastas no cwd usando este:
for file in `ls`; do touch $file; done
Mas isso não parece funcionar. Alguma idéia do porquê?
Estou tentando atualizar os carimbos de data e hora de todas as pastas no cwd usando este:
for file in `ls`; do touch $file; done
Mas isso não parece funcionar. Alguma idéia do porquê?
Respostas:
Todas as respostas até agora (assim como o seu exemplo na pergunta) pressupõem que você queira touch
tudo no diretório, mesmo que tenha dito "toque em todas as pastas". Se o diretório contiver arquivos e pastas e você desejar apenas atualizar as pastas, poderá usar find
:
$ find . -maxdepth 1 -mindepth 1 -type d -exec touch {} +
Ou se sua find
implementação não suportar os predicados -mindepth
/ não padronizados -maxdepth
:
$ find . ! -name . -prune -type d -exec touch {} +
Este:
$ touch -c -- */
Deve funcionar na maioria das conchas, exceto que:
touch
links simbólicos para diretórios , além de diretórios simples*
em outras do que conchas csh
, tcsh
, zsh
, fish
ou o shell Thompson (que iria relatar um erro em vez disso). Aqui, estamos usando -c
para contornar isso, embora ainda possa ser touch
chamado um arquivo que não seja de diretório *
.Com zsh
, touch
apenas para diretórios, incluindo os ocultos:
touch -- *(D/)
{} \+
é especial find
- leia a página de manual para obter mais informações. Eu acho touch -c ./*/
que também funcionaria.
-maxdepth 1
no comando, para que find
não seja recursivo em subpastas. O OP parece querer tocar apenas nas pastas no cwd, não nas subpastas.
Experimentar
touch ./*
Evita o for
loop desnecessário que geraria um novo processo para cada arquivo e funciona para todos os nomes de arquivos, mesmo aqueles com espaços ou com opções parecidas (como -t
). O único momento em que isso não funcionaria é se você não tiver arquivos (sem pontos) no diretório e, nesse caso, acabaria criando um arquivo chamado *
. Para evitar isso, no caso específico da touch
maioria das implementações, há uma -c
opção (também chamada --no-create
nas versões GNU) de não criar arquivos inexistentes, ou seja,
touch -c ./*
Veja também as boas referências em resposta de jasonwryan assim como este um .
Você não deve tentar analisar a saída dels
.
Além disso, você deve citar seu "$file"
para capturar qualquer espaço em branco. Consulte http://www.grymoire.com/Unix/Quote.html
Algo assim pode alcançar o que você procura:
for file in *; do touch "$file"; done
Veja as duas primeiras Bash Pitfalls para uma explicação mais completa.
*
não captura arquivos e diretórios cujo nome começa com um ponto. Uma maneira de corrigir isso é ativar a dotglob
opção de shell via shopt -s dotglob
.