Командная строка списка файлов (скрытые и вложенные папки)

Мне нужно получить текстовый список всех файлов (скрытых и видимых) с жесткого диска, включая вложенные папки. В идеале, если возможно, список будет иметь имя файла, путь, размер и дату создания (или последнего изменения). Может кто-нибудь, пожалуйста, скажите мне, какую команду мне нужно? Кроме того, возможно ли, что это было создано как файл .csv или что-то подобное для использования в Excel?

Я не очень хорошо разбираюсь в Ubuntu, поэтому было бы также полезно объяснение каждого элемента команды.

3
задан 25 April 2018 в 23:51

4 ответа

С bash

Предполагая, что рассматриваемый диск установлен в /media/disk1:

$ shopt -s globstar dotglob $ stat -c '"%n",%s,%y' /media/disk1/**/* >disk1.csv

shopt -s globstar dotglob включает функцию рекурсивного глобирования bash (позволяет использовать '* * ', см. https://unix.stackexchange.com/questions/49913/recursive-glob). Он также включает сопоставление файлов, начинающихся с ., также известных как скрытые файлы.

stat - это программа, используемая для получения метаданных файлов. В основном эта программа будет запускаться для каждого файла на диске.

-c '"%n",%s,%y' указывает формат вывода для команды stat. %n - это имя файла, заключенное в двойные кавычки, %s - это размер файла, %y - это последнее время модификации. (см. stat --help)

/media/disk1/**/* сообщает bash передать все имена файлов, рекурсивно найденные по этому пути к пограмме (stat), как для обычных, так и для скрытых файлов, поскольку dotglob включен. [ ! d7]

>disk1.csv перенаправляет вывод в файл с именем stat .

Результат в disk1.csv будет выглядеть так, например, для моего дома:

$ stat -c '"%n",%s,%y' /home/seb/**/* "/home/seb/111",82,2018-03-26 18:38:04.048099912 +0200 "/home/seb/app",4096,2017-07-13 23:39:06.509862769 +0200 "/home/seb/Applications",4096,2018-03-14 20:20:48.552005660 +0100 "/home/seb/Applications/arduino-1.8.2",4096,2017-05-29 20:45:01.184017517 +0200 "/home/seb/Applications/arduino-1.8.2/arduino",946,2017-03-22 13:32:41.000000000 +0100 [...]

Я протестировал, чтобы импортировать полученный csv в libreoffice calc, и он работал хорошо, также со смешными именами файлов с разрывами строк в них.

ARG_MAX

Вышеуказанная команда не будет работать, если общее количество файлов слишком велико или общее количество символов во всех имена файлов слишком велики. Для небольших дисков (USB-накопителей и т. Д.) Этого должно быть достаточно, но если вы индексируете большой диск с миллионами файлов, вы, вероятно, попадете в этот предел.

Вместо этого вы можете запустить следующее: оно будет (и есть меньше памяти):

find /media/disk1 -type f -print0 | xargs -0 stat -c '"%n",%s,%y' >disk1.csv

Для шаблона «find .. -print0 | xargs -0 ..» вы найдете здесь много ответов, например. г. [D3] https://unix.stackexchange.com/questions/49913/recursive-glob

7
ответ дан 17 July 2018 в 16:10

С GNU find:

find /path/to -type f -printf '%f,%h/,%s,%TD %Tr\n' > all-files.csv Имя файла %f возвращают файл с удалением всех ведущих каталогов (только последний элемент). [F3] возвращает ведущие каталоги имени файла (все, кроме последнего элемента). [F4] возвращает размер файла в байтах. [F5] возвращает время последней модификации файла в формате, заданном k; поэтому [F6] возвращает время последней модификации файла в формате mm/dd/yy. %Tr возвращает время последней модификации файлов в формате time, 12-hour (hh:mm:ss [AP]M). /, , и \n печатает символ косой черты, запятую и \n ewline соответственно.

, пожалуйста, прочитайте раздел man find и -printf format.

3
ответ дан 17 July 2018 в 16:10

С bash

Предполагая, что рассматриваемый диск установлен в /media/disk1:

$ shopt -s globstar dotglob $ stat -c '"%n",%s,%y' /media/disk1/**/* >disk1.csv

shopt -s globstar dotglob включает функцию рекурсивного глобирования bash (позволяет использовать '* * ', см. https://unix.stackexchange.com/questions/49913/recursive-glob). Он также включает сопоставление файлов, начинающихся с ., также известных как скрытые файлы.

stat - это программа, используемая для получения метаданных файлов. В основном эта программа будет запускаться для каждого файла на диске.

-c '"%n",%s,%y' указывает формат вывода для команды stat. %n - это имя файла, заключенное в двойные кавычки, %s - это размер файла, %y - это последнее время модификации. (см. stat --help)

/media/disk1/**/* сообщает bash передать все имена файлов, рекурсивно найденные по этому пути к пограмме (stat), как для обычных, так и для скрытых файлов, поскольку dotglob включен. [ ! d7]

>disk1.csv перенаправляет вывод в файл с именем stat .

Результат в disk1.csv будет выглядеть так, например, для моего дома:

$ stat -c '"%n",%s,%y' /home/seb/**/* "/home/seb/111",82,2018-03-26 18:38:04.048099912 +0200 "/home/seb/app",4096,2017-07-13 23:39:06.509862769 +0200 "/home/seb/Applications",4096,2018-03-14 20:20:48.552005660 +0100 "/home/seb/Applications/arduino-1.8.2",4096,2017-05-29 20:45:01.184017517 +0200 "/home/seb/Applications/arduino-1.8.2/arduino",946,2017-03-22 13:32:41.000000000 +0100 [...]

Я протестировал, чтобы импортировать полученный csv в libreoffice calc, и он работал хорошо, также со смешными именами файлов с разрывами строк в них.

ARG_MAX

Вышеуказанная команда не будет работать, если общее количество файлов слишком велико или общее количество символов во всех имена файлов слишком велики. Для небольших дисков (USB-накопителей и т. Д.) Этого должно быть достаточно, но если вы индексируете большой диск с миллионами файлов, вы, вероятно, попадете в этот предел.

Вместо этого вы можете запустить следующее: оно будет (и есть меньше памяти):

find /media/disk1 -type f -print0 | xargs -0 stat -c '"%n",%s,%y' >disk1.csv

Для шаблона «find .. -print0 | xargs -0 ..» вы найдете здесь много ответов, например. г. [D3] https://unix.stackexchange.com/questions/49913/recursive-glob

7
ответ дан 23 July 2018 в 17:04
  • 1
    Или с флагом find '-exec, который также учитывает ограничение ARG_MAX: find /media/disk1 -type f -exec stat -c '"%n",%s,%y' {} + >disk1.csv. Вы также можете работать ARG_MAX с printf как , показанным steeldriver . – dessert 22 May 2018 в 13:14

С GNU find:

find /path/to -type f -printf '%f,%h/,%s,%TD %Tr\n' > all-files.csv Имя файла %f возвращают файл с удалением всех ведущих каталогов (только последний элемент). [F3] возвращает ведущие каталоги имени файла (все, кроме последнего элемента). [F4] возвращает размер файла в байтах. [F5] возвращает время последней модификации файла в формате, заданном k; поэтому [F6] возвращает время последней модификации файла в формате mm/dd/yy. %Tr возвращает время последней модификации файлов в формате time, 12-hour (hh:mm:ss [AP]M). /, , и \n печатает символ косой черты, запятую и \n ewline соответственно.

, пожалуйста, прочитайте раздел man find и -printf format.

3
ответ дан 23 July 2018 в 17:04

Другие вопросы по тегам:

Похожие вопросы: