Мне нужно получить текстовый список всех файлов (скрытых и видимых) с жесткого диска, включая вложенные папки. В идеале, если возможно, список будет иметь имя файла, путь, размер и дату создания (или последнего изменения). Может кто-нибудь, пожалуйста, скажите мне, какую команду мне нужно? Кроме того, возможно ли, что это было создано как файл .csv или что-то подобное для использования в Excel?
Я не очень хорошо разбираюсь в Ubuntu, поэтому было бы также полезно объяснение каждого элемента команды.
Предполагая, что рассматриваемый диск установлен в /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, и он работал хорошо, также со смешными именами файлов с разрывами строк в них.
Вышеуказанная команда не будет работать, если общее количество файлов слишком велико или общее количество символов во всех имена файлов слишком велики. Для небольших дисков (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
С 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.
Предполагая, что рассматриваемый диск установлен в /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, и он работал хорошо, также со смешными именами файлов с разрывами строк в них.
Вышеуказанная команда не будет работать, если общее количество файлов слишком велико или общее количество символов во всех имена файлов слишком велики. Для небольших дисков (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
С 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.