How to only get file name with Linux ‘find’?
In GNU find you can use -printf parameter for that, e.g.:
find /dir1 -type f -printf "%f\n"
@Urchin No reason it shouldn’t so long as you have correct logic (i.e. -o has lower precedence than implied -a , so you will often want to group your -o arguments)
I don’t think this is the right answer. find -printf «%f\n» -exec echo <> \; reveals that the original filename is passed forward
If your find doesn’t have a -printf option you can also use basename:
find ./dir1 -type f -exec basename <> \;
Use -execdir which automatically holds the current file in <> , for example:
find . -type f -execdir echo '<>' ';'
You can also use $PWD instead of . (on some systems it won’t produce an extra dot in the front).
If you still got an extra dot, alternatively you can run:
find . -type f -execdir basename '<>' ';'
-execdir utility [argument . ] ;
The -execdir primary is identical to the -exec primary with the exception that utility will be executed from the directory that holds the current file.
When used + instead of ; , then <> is replaced with as many pathnames as possible for each invocation of utility. In other words, it’ll print all filenames in one line.
If you are using GNU find
Or you can use a programming language such as Ruby(1.9+)
If you fancy a bash (at least 4) solution
shopt -s globstar for file in **; do echo $; done
If you want to run some action against the filename only, using basename can be tough.
find ~/clang+llvm-3.3/bin/ -type f -exec echo basename <> \;
will just echo basename /my/found/path . Not what we want if we want to execute on the filename.
But you can then xargs the output. for example to kill the files in a dir based on names in another dir:
cd dirIwantToRMin; find ~/clang+llvm-3.3/bin/ -type f -exec basename <> \; | xargs rm
find /dir1 -type f -exec basename <> \;
As others have pointed out, you can combine find and basename , but by default the basename program will only operate on one path at a time, so the executable will have to be launched once for each path (using either find . -exec or find . | xargs -n 1 ), which may potentially be slow.
If you use the -a option on basename , then it can accept multiple filenames in a single invocation, which means that you can then use xargs without the -n 1 , to group the paths together into a far smaller number of invocations of basename , which should be more efficient.
find /dir1 -type f -print0 | xargs -0 basename -a
Here I’ve included the -print0 and -0 (which should be used together), in order to cope with any whitespace inside the names of files and directories.
Here is a timing comparison, between the xargs basename -a and xargs -n1 basename versions. (For sake of a like-with-like comparison, the timings reported here are after an initial dummy run, so that they are both done after the file metadata has already been copied to I/O cache.) I have piped the output to cksum in both cases, just to demonstrate that the output is independent of the method used.
$ time sh -c 'find /usr/lib -type f -print0 | xargs -0 basename -a | cksum' 2532163462 546663 real 0m0.063s user 0m0.058s sys 0m0.040s $ time sh -c 'find /usr/lib -type f -print0 | xargs -0 -n 1 basename | cksum' 2532163462 546663 real 0m14.504s user 0m12.474s sys 0m3.109s
As you can see, it really is substantially faster to avoid launching basename every time.
Работа с файлами и каталогами в командной оболочке Bash
Bash (Bourne Again Shell) — это командная оболочка, использующаяся в таких UNIX-системах, как Linux или MacOS. Она позволяет управлять компонентами ОС с помощью определённых запросов, которые вводятся в консоль или берутся из скрипта.
Как новичкам, так и опытным пользователям будет полезно узнать или вспомнить основные команды Bash для управления такими важными аспектами системы, как файлы и каталоги. Этот вопрос будет разобран на примере ОС Linux.
Работа с файлами и каталогами
Работа с файлами и каталогами в Linux через Bash осуществляется с учетом иерархического принципа их классификации. Иерархическая структура файловой системы Linux напоминает «дерево». Существует корневой каталог, который является начальным для всей ОС, а в нём, соответственно, масса других подкаталогов.
Такой же принцип используется для командной строки. Файлы и каталоги берут начало из корневого узла « / », который является начальной точкой для всех элементов.
Ниже представлен стандартный перечень подкаталогов, встречающийся в большинстве UNIX-систем.
Каталог | Содержимое |
/bin | Бинарные версии файлов (в том числе для командной оболочки). |
/dev | Псевдофайлы, представляющие собой аппаратные средства, подключённые к устройству. |
/etc | Большая часть конфигурационных файлов. |
/lib | Библиотеки для системных приложений. |
/opt | Необязательные компоненты системы или приложения. |
/tmp | Временные файлы. |
/usr | Пользовательские компоненты. |
/var | Файлы приложений (в том числе системные журналы, кэши и т. д.). |
Команды для каталогов
Существуют конкретные команды, предназначенные для работы с каталогами. Далее будут приведены самые важные из них.
Список основных команд
- pwd — вывод полного пути к текущему каталогу.
- cd — переход с текущего каталога на домашний пользовательский.
- cd dirname — перейти в папку «dirname».
- cd / — переход по директориям относительно корневого каталога.
- ls — просмотреть список файлов в каталоге.
- ls -d */ — просмотреть список папок в текущем каталоге.
- ls dirname — вывод содержимого каталога «dirname» на экран.
- mkdir dirname — создать папку с наименованием «dirname».
- rmdir dirname — удалить папку «dirname».
- rm -rf dirname — удалить папку «dirname» с её содержимым (опция -r) без предупреждения пользователя (опция -f).
- du -h dirname — размер папки «dirname».
Помимо этого, существуют полезные сокращения. Например, текущая директория обозначается с помощью « . ». Знак « .. » позволяет задействовать родительский каталог. Для представления домашней директории используется « ~ ».
Пример использования сокращений:
root@test:~/dirname/files# cd .. # переход в родительский (предыдущий) каталог root@test:~# du -h . # вывод данных о размере текущего каталога и его элементов 4,0K ./files 8,0K . root@test:~/dirname# cd ~ # переход в домашний каталог root@test:~#
Команды для файлов
Далее приведены основные команды для осуществления взаимодействия с файлами. Начинающим полезно опробовать каждую из них, чтобы лучше понять принцип работы утилит.
Список основных команд
- touchfile — создать файл.
- realpath file — узнать абсолютный путь к файлу.
- stat file1 — получение информации о «file1» (размер файла, дата создания файла и т. д.) и проверка существования файла.
- cat > file — запись в файл.
- catfile — чтение файла.
- echo текст >> file — дописать в файл текст.
- find file — поиск файла.
- mcedit file — редактирование файла (также можно использовать редакторы Nano, Vim и другие).
- cat file1 file2 > file12 — объединение файлов.
- sh filename — запустить файл со сценарием Bash.
- ./filename — запустить исполняемый файл.
- cp file1 file2 — копировать файл «file1» с переименованием на «file2». Произойдёт замена файлов, если элемент с таким же названием существует.
- mv file1 file2 — переименовать файл «file1» в «file2».
- mv filename dirname — переместить файл «filename» в каталог «dirname».
- less filename — открыть файл в окне терминала.
- file filename — определение типа файла.
- head filename — вывод нескольких начальных строк из файла на экран (построчное чтение файла). По умолчанию строк 10.
- tail filename — вывод нескольких конечных строк из файла на экран.
- diff file1 file2 — сравнение файлов.
- grep text filename — поиск и вывод строк из файла, содержащих «text».
- rm filename — удалить файл.
Подробную информацию об утилитах можно получить, воспользовавшись справочной службой: « man ».
Пример получения справки по работе с программой rm: « man rm ».
Перенаправление данных
Перенаправление ввода-вывода в файл осуществляется с помощью специальных знаков. Для вывода используются « > » и « >> », а для ввода — « < ».
Пример вывода « ls » в файл, а не на экран:
root@test:~# ls > files.txt root@test:~# cat files.txt file1.cpp sample.txt
Новый файл создаётся автоматически. В случае существования элемента с таким же наименованием, произойдёт перезапись. Чтобы этого избежать, необходимо использовать « >> ». Тогда данные будут дописываться в документ.
Пример ввода, при котором информация выносится из файла с помощью команды « sort »:
root@test:~# echo text > file.txt root@test:~# sort < file.txt text
Генерация имён файлов в Bash
Иногда пользователю приходится работать с несколькими файлами одновременно, например, при выполнении переноса документов в другой каталог. Это станет проблемой, если элементов десятки или сотни и среди них нужно отобрать определённые.
Для решения поставленной задачи можно попробовать использование шаблонного выражения, позволяющего Bash определить необходимые элементы, ориентируясь по наименованию. Этот способ упрощает управление группой файлов путём применения короткой формулировки в команде.
Итак, теперь остаётся разобраться с вопросом составления шаблонов. Сейчас будут приведены основные конструкции для осуществления генерации имён. Чаще всего для отбора файлов применяется символ: « * ». В случае использования этого знака в чистом виде, Bash выберет все элементы в каталоге без исключений.
root@test:~# ls * document1.docx document2.docx document3.txt file1.txt file2.docx file3.txt
Для примера, чтобы из этого каталога отобрать файлы: file1, file2, file3, следует воспользоваться шаблоном:
root@test:~# ls file* file1.txt file2.docx file3.txt
Символ звёздочки позволяет командному интерпретатору выделить все файлы, начинающиеся с «file». При этом последующая часть наименования будет проигнорирована.
Знак « * » можно использовать также в начале или с обеих сторон шаблона.
Кроме того, сгенерировать имена можно, взяв за основу расширение файла. Например:
root@test:~# ls .txt* document3.txt file1.txt file3.txt
Надежный хостинг для сайта. 14 дней - бесплатно!