Eu tenho a solução. O comando de localização abaixo atende aos meus requisitos.
find . -maxdepth 1 -type d \( ! -name . \) -exec bash -c "cd '{}' && ls -l |awk '{ print $9 }' |grep 'date +"%m%d%Y"'|xargs echo" \;
Eu quero que meu script de shell visite todos os subdiretórios em um diretório principal. Faça algo nos diretórios, envie a saída para um arquivo de spool e vá para o próximo diretório. Considerar Dir principal = / tmp Subdir = A B C D (Quatro subdiretórios)
Use um loop for
:
for d in $(find /path/to/dir -maxdepth 1 -type d)
do
#Do something, the directory is accessible with $d:
echo $d
done >output_file
Ele procura apenas os subdiretórios do diretório /path/to/dir
. Observe que o exemplo simples acima falhará se os nomes dos diretórios contiverem espaços em branco ou caracteres especiais. Uma abordagem mais segura é:
find /tmp -maxdepth 1 -type d -print0 |
while IFS= read -rd '' dir; do echo "$dir"; done
Ou em bash
:
for d in /path/to/dir/*; do
if [ -d "$d" ]; then
echo "$d"
fi
done
(observe que, ao contrário de find
, também se considera links simbólicos para diretórios e exclui os ocultos)
Eu sou um completo bash
newbie, mas um veterano da UN * X. Embora, sem dúvida, isso possa ser feito no shell script do Bash, antigamente usamos find [-maxdepth <levels>] <start-dir> -exec <command> ;
para conseguir isso. Você poderia fazer um man find
e brincar, talvez até alguém lhe dizer como fazer isso em bash
!
Parece que você deseja os nomes dos arquivos em cada um dos subdiretórios; o ls -l | awk
não é robusto o suficiente, e se esses nomes de arquivo contiverem espaços em branco e / ou novas linhas? O find
abaixo funcionaria mesmo para find
s que, por acaso, não têm o -maxdepth
:
find . ! -name . -type d -prune -exec sh -c '
cd "$1" && \
find "." ! -name . -prune -type f
' {} {} \;
Também é possível usar ls, grep e tr
for dir in $(ls -1FA | grep / | tr -d /); do echo $dir/something; done
ls -1FA | grep / | tr -d / | while IFS= read -r TD; do echo $TD/something; done
du / sed também pode ser usado como um seletor se o seu ls não tiver as opções acima
du --max-depth=1 | sed -e 's/^.*\.\///' | grep -v '\.$'
Pode ser importante observar que esses exemplos retornam diretórios ocultos e excluem diretórios pais e atuais
Tags bash shell-script