Versão de uma linha
Use find
para obter diretórios primeiro e, em seguida, shell faça o trabalho para você:
$ tree
.
├── a_directory
│ ├── a_file
│ ├── a_subdir
│ └── mv-files.py
└── another_dir
├── {file}1
└── {file}2
3 directories, 4 files
$ find -type d -exec bash -c 'cd $1; find -maxdepth 1 -not -name "." -not -name "list.txt" -printf "%f," | awk "{print substr(\#!/bin/bash
# note : this assumes you run the script from top-most directory
find -type d | while IFS= read -r directory;
do
cd "$directory"
find -maxdepth 1 -not -name "." -not -name "list.txt" -printf "%f," |
awk "{print substr(\$ tree
.
├── a_directory
│ ├── a_file
│ ├── a_subdir
│ └── mv-files.py
├── another_dir
│ ├── {file}1
│ └── {file}2
└── make_lists.sh
3 directories, 5 files
$ ./make_lists.sh
$ tree
.
├── a_directory
│ ├── a_file
│ ├── a_subdir
│ │ └── list.txt
│ ├── list.txt
│ └── mv-files.py
├── another_dir
│ ├── {file}1
│ ├── {file}2
│ └── list.txt
├── list.txt
└── make_lists.sh
3 directories, 9 files
$ cat a_directory/list.txt
mv-files.py,a_file,a_subdir
,0,length(\$ tree
.
├── a_directory
│ ├── a_file
│ ├── a_subdir
│ └── mv-files.py
└── another_dir
├── {file}1
└── {file}2
3 directories, 4 files
$ find -type d -exec bash -c 'cd $1; find -maxdepth 1 -not -name "." -not -name "list.txt" -printf "%f," | awk "{print substr(\#!/bin/bash
# note : this assumes you run the script from top-most directory
find -type d | while IFS= read -r directory;
do
cd "$directory"
find -maxdepth 1 -not -name "." -not -name "list.txt" -printf "%f," |
awk "{print substr(\$ tree
.
├── a_directory
│ ├── a_file
│ ├── a_subdir
│ └── mv-files.py
├── another_dir
│ ├── {file}1
│ └── {file}2
└── make_lists.sh
3 directories, 5 files
$ ./make_lists.sh
$ tree
.
├── a_directory
│ ├── a_file
│ ├── a_subdir
│ │ └── list.txt
│ ├── list.txt
│ └── mv-files.py
├── another_dir
│ ├── {file}1
│ ├── {file}2
│ └── list.txt
├── list.txt
└── make_lists.sh
3 directories, 9 files
$ cat a_directory/list.txt
mv-files.py,a_file,a_subdir
,0,length(\%pre%)-1)}" > list.txt
cd - > /dev/null
done
,0,length(\%pre%)-1)}" > list.txt' bash "{}" \;
$ cat a_directory/list.txt
mv-files.py,a_file,list.txt,a_subdir
)-1)}" > list.txt
cd - > /dev/null
done
,0,length(\%pre%)-1)}" > list.txt' bash "{}" \;
$ cat a_directory/list.txt
mv-files.py,a_file,list.txt,a_subdir
A maneira como isso funciona:
- usamos o comando
find
com -type d
para filtrar todos os diretórios
-
A instrução
-exec
com \;
terminator nos permite executar o comando especificado para cada argumento que find
obtém
- em
-exec
, executamos bash
com -c
flag, para o qual passamos $0
argumento bash
e $1
argumento sendo o diretório que outter find
locaed
-
bash
entrará no diretório fornecido e usará o argumento find
with - maxdepth 1
para limitar esse comando apenas a esse subdiretório. -not -name "."
excluirá o link do diretório .
, que é referência para si mesmo.
- Em seguida, passamos o texto para
awk
, que serve apenas para remover o último ,
dado por find
, para que tenhamos uma lista de CSV válida. Observe o uso de aspas duplas e \$
. Isso significa simplificar as citações e impedir que o bash interprete $0
como seus próprios argumentos posicionais, mas sim como o comando awk
.
- Toda a lista de itens que o% interno
find
obtém será enviada para o list.txt
via redirecionamento >
.
Melhoria adicional para isso poderia ser usar -not -name "list.txt"
dentro do comando find
interno para excluir o próprio arquivo de lista (porque >
sempre cria o arquivo para gravar primeiro, list.txt
também aparecerá na lista ).
Pessoalmente, se eu estivesse fazendo isso por mim, escreveria a lista de arquivos com list.txt
separator para evitar lidar com nomes de arquivo difíceis, mas isso também exige lembrar que ~/bin
está em $PATH
format e writing uma função parser para isso.
Versão completa do script
Por questão de legibilidade, aqui está uma versão completa do script, em vez de uma linha.
Script:
%pre%
Observe que esse script é executado no diretório mais superior. Também inclui auto na lista se estiver armazenado no mesmo diretório. Se você colocá-lo em %code% , por exemplo (ou qualquer outro diretório que pertença a %code% variable), e executá-lo, o nome do script não aparecerá na lista.
Teste:
%pre%