Как вывести список всех файлов в каталоге без абсолютных путей вместе с их размерами при использовании команды find - PullRequest
0 голосов
/ 28 сентября 2019

GNU bash, версия 4.4.0
Ubuntu 16.04

Я хочу вывести список всех файлов из каталога и распечатать их во втором столбце при печати размера файла.файлы в первом столбце.пример

1024 test.jpg
1024 test.js
1024 test.css
1024 test.html  

Я уже сделал это с помощью команды ls, но shellcheck не нравится.Пример:

In run.sh line 47:
ls "$localFiles" | tail -n +3 | awk '{ print $5,$9}' > "${tmp_input3}"
^-- SC2012: Use find instead of ls to better handle non-alphanumeric filenames.  

Когда я использую команду find, она также возвращает абсолютный путь.Пример:

root@me ~ # mkdir -p /home/remove/test/directory
root@me ~ # cd /home/remove/test/directory && truncate -s 1k test.css test.js test.jpg test.html && cd
root@me ~ # find /home/remove/test/directory -type f -exec ls -ld {} \; | awk '{ print $5, $9 }'
1024 /home/remove/test/directory/test.jpg
1024 /home/remove/test/directory/test.js
1024 /home/remove/test/directory/test.css
1024 /home/remove/test/directory/test.html  

Какой самый эффективный способ достижения моей цели.Это может быть любая команда, если она хороша, я счастлив.

Ответы [ 3 ]

1 голос
/ 29 сентября 2019

Пожалуйста, попробуйте:

find dir -maxdepth 1 -type f -printf "%s %f\n"
1 голос
/ 28 сентября 2019

Вы можете использовать что-то, как показано ниже,

Это основная команда,

vagrant@ubuntu-bionic:~$ find ansible_scripts/ -follow -type f  -exec wc -c {} \;

Вывод,

vagrant@ubuntu-bionic:~$ find ansible_scripts/ -follow -type f  -exec wc -c {} \;
59 ansible_scripts/hosts
59 ansible_scripts/main.yml
266 ansible_scripts/roles/role1/tasks/main.yml
30 ansible_scripts/roles/role1/tasks/vars/var3.yaml
4 ansible_scripts/roles/role1/tasks/vars/var2.yaml
37 ansible_scripts/roles/role1/tasks/vars/var1.yaml

Приведенная выше команда используется для отображенияабсолютный путь, который я получаю, используя команду поиска.

Ниже приведена обновленная команда , которую вы можете использовать, чтобы получить только размер и имя файла, но это может вызвать некоторую неоднозначность, если имена файлов совпадают..

Команда

find ansible_scripts/ -follow -type f  -exec wc -c {}  \; | awk -F' ' '{n=split($0,a,"/"); print $1" "a[n]}'

Выход

vagrant@ubuntu-bionic:~$ find ansible_scripts/ -follow -type f  -exec wc -c {}  \; | awk -F' ' '{n=split($0,a,"/"); print $1" "a[n]}'
59 hosts
59 main.yml
266 main.yml
30 var3.yaml
4 var2.yaml
37 var1.yaml

Состояние проверки оболочки Online Shell Check status

0 голосов
/ 28 сентября 2019

Реальная проблема (которую выделяет shellcheck) - это обработка имен файлов со встроенными пробелами.Поскольку (более старые версии) ls используют переводы строк для разделения вывода для разных файлов, трудно обрабатывать файлы со встроенными (или завершающими) символами новой строки.

Из вопроса и примера вывода не яснокак будут обрабатываться файлы с символами новой строки.

Предполагая, что нет необходимости обрабатывать имена файлов со встроенными символами новой строки, вы можете использовать 'wc' (с -c).

(cd "$pathToDir" && wc -c *)

Стоит отметить, что (более новые версии) ls предоставляют несколько опций для обработки имен файлов со встроенными символами новой строки (например, -b).К сожалению, shellcheck не распознает и выдает такое же сообщение об ошибке («используйте вместо поиска ...»), даже когда код правильно обрабатывает эту ситуацию.

Чтобы получить поддержку файлов со встроенными символами новой строки, можноиспользуйте цитату ls:

#! /bin/bash
     # Function will 'hide' the error message.
function myls {
        cd "$1" || return
        ls --b l "$@"
}

     # Short awk script to combine $9, $10, $11, ... into file name
     # Correctly handle file name contain spaces
(myls "$pathToDir") |
    awk '{ N=$9 ; for (i=10 ; i<=NF ; i++) N=N + " " $i ; print $5, N }'
...