Encontre o tamanho dos nomes dos arquivos com espaço e hífen | passar nomes de arquivos contendo espaço e hífen para “du” [duplicado]

0

Eu tenho um arquivo, que contém o nome de alguns arquivos. Quero encontrar o tamanho total dos arquivos na lista.

#cat filelist
/tmp-directory/connector_db_ connector_db
/tmp-directory/connector_db -connector_db
/tmp-directory/connector_db_connector_db

Como você pode ver, os nomes do arquivo contêm espaço e mais mal um hífen (-) . Eu estou tentando encontrar o tamanho total desses arquivos com o comando abaixo.

#du -sch 'cat filelist'
du: invalid option -- 'o'
du: invalid option -- 'n'
du: invalid option -- 'n'
du: invalid option -- 'e'
du: invalid option -- 't'
du: invalid option -- 'o'
du: invalid option -- 'r'
du: invalid option -- '_'
du: invalid maximum depth 'b'

Eu tentei adicionar "" como mostrado abaixo e tentei o que também falhou

#cat filelist
"/tmp-directory/connector_db_ connector_db"
"/tmp-directory/connector_db -connector_db"
"/tmp-directory/connector_db_connector_db"

#du -sch 'cat filelist'
du: invalid option -- 'o'
du: invalid option -- 'n'
.....

Mas isso funciona quando eu uso o comando abaixo, diretamente no shell.

#du -sch "/tmp-directory/connector_db -connector_db"
0       /tmp-directory/connector_db -connector_db
0       total

Então, como lidar com essa situação. Eu tenho filelist de 3 arquivos lac. Mais mal, "du -sch" não está lidando com a lista quando a lista de arquivos excede em torno de 20000. Estou dividindo a lista em 20000 linhas com o comando split. Existe algum método alternativo para encontrar o tamanho de 3 arquivos lac facilmente?

    
por Midhun Jose 09.06.2017 / 06:21

2 respostas

0

Como você não colocou aspas em torno da substituição de comandos, a divisão de palavras está ocorrendo aqui, de acordo com o valor de IFS (espaço, tabulação, nova linha por padrão). Você tem espaço no nome do arquivo, por exemplo, /tmp-directory/connector_db_ connector_db está sendo dividido em duas palavras - /tmp-directory/connector_db_ , connector_db .

Você pode iterar os nomes dos arquivos, um por um:

while IFS= read -r file; do du -sch -- "$file"; done <filelist

Como seu arquivo é grande, isso pode levar algum tempo.

Além disso, como os arquivos estão sendo analisados individualmente, você não terá o tamanho total mostrado por du . Então você pode soltar -s e -c :

while IFS= read -r file; do du -h -- "$file"; done <filelist
    
por 09.06.2017 / 06:27
1
xargs -Ifile du -sch file <filelist

Contanto que nenhum nome de arquivo contenha uma nova linha, o acima chamará du -sch em cada um dos nomes em filelist . -Ifile fará com que xargs substitua a string file no comando du -sch file com cada nome lido de filelist .

Isto irá lidar com nomes de arquivos com espaços e com padrões de globalização shell (padrões não serão expandidos).

    
por 09.06.2017 / 06:30