Eu tenho um diretório chamado 'dir', e há um subdiretório nele chamado 'subdir'. Subdir tem muitos arquivos nele. Eu gostaria de escrever para listar esses arquivos em um arquivo CSV e salvá-lo no diretório 'dir' com uma linha de comando no linux. Meu código cria o arquivo csv, mas o salva no subdir, mas não no dir. Onde eu erro? Estou no diretório dir;
dir$ ls subdir >names.csv
Como uma alternativa mais fácil, você pode cd para subdir e usar
Isso fornecerá uma lista separada por nova linha e terminada por nova linha sem vírgulas envolvidas. Você pode vê-lo como um arquivo csv degenerado com apenas uma coluna.
Se você deseja incluir arquivos ocultos (arquivos com nomes que começam com um ponto), você pode usar
* .*
em vez do único*
. Se você deseja excluir o . e .. nomes de diretório, use* .[^.]* ..?*
em vez disso. No total:Mas lembre-se de que os nomes de arquivos no Linux podem conter novas linhas. Na verdade, o único separador de byte único exclusivo para nomes de arquivos é o byte nulo.
Atualização devido a este comentário :
Vamos supor que você tenha qualquer número de subdiretórios cujos conteúdos não ocultos você deseja catalogar em arquivos separados no diretório pai comum. (Coletar todos os nomes em um arquivo é muito mais curto, veja esta solução elegante . E, para dizer a verdade, não li seu comentário com atenção suficiente.) Isso pode ser feito nesse diretório pai (dir no seu caso) por
Isso requer os programas
find
,bash
ebasename
.Ao usá-lo, você deve tomar cuidado extra, esse diretório não contém arquivos cujos nomes conflitem com as listas csv geradas automaticamente.
Aqui está como funciona:
find
considera cada arquivo que está exatamente um nível de diretório abaixo do diretório atual (.
)—é isso que-mindepth 1 -maxdepth 1
faz—: Se for um diretório (-type d
) ele executa (-exec
) o comando entre-exec
e o final\;
após substituir as chaves vazias ({}
) pelo nome desse diretório. Se denotarmos este nome por<SUBDIR>
, isso resulta emIsso inicia
bash
em um subprocesso, fazendo com que ele execute o argumento da-c
opção como um script de shell, ou sejaque é praticamente o mesmo que acima. Aqui, a expressão
é expandido para o nome base de
<SUBDIR>
. Isso é necessário porque<SUBDIR>
irá iterar através de ./subdir1, ./subdir2, etc no seu caso. Os nomes de base correspondentes são subdir1, subdir2, etc.Você deve conseguir isso usando o loop for .
Se meu entendimento estiver correto, você deseja obter uma lista de arquivos no subdiretório. Então faça algo assim:
Agora, você pode ver que um arquivo chamado "filelist.csv" foi criado em seu diretório dir.