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ê?
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/)
{} \+
é especialfind
- leia a página de manual para obter mais informações. Eu achotouch -c ./*/
que também funcionaria.-maxdepth 1
no comando, para quefind
não seja recursivo em subpastas. O OP parece querer tocar apenas nas pastas no cwd, não nas subpastas.Experimentar
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 datouch
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,Veja também as boas referências em resposta de jasonwryan assim como este um .
fonte
find . -type d -maxdepth1 -print0 | xargs -0 touch
a resposta de MichaelMrozek acima.Você não deve tentar analisar a saída de
ls
.Além disso, você deve citar seu
"$file"
para capturar qualquer espaço em branco. Consulte http://www.grymoire.com/Unix/Quote.htmlAlgo assim pode alcançar o que você procura:
Veja as duas primeiras Bash Pitfalls para uma explicação mais completa.
fonte
touch ./*
deve funcionar na maioria dos casos. Realmente não há necessidade dofor
loop, poistouch
pode levar vários arquivos, e você precisa./
lidar com arquivos com nomes como--help
corretamente. Este é um bom recurso sobre o assunto.*
não captura arquivos e diretórios cujo nome começa com um ponto. Uma maneira de corrigir isso é ativar adotglob
opção de shell viashopt -s dotglob
.fonte