- How to Use the find Command With exec
- Using exec command with the output of find command
- Practical examples of combining find and exec commands
- 1. Find and display file attributes
- 2. Find and rename files
- 3. Collect and store file sizes
- 4. Remove files with specific parameters
- 5. Execute specific tools
- 6. Change the ownership of files and directories
- 7. Changing the permission of files
- 8. Collect md5sum for each file
- 9. Combine exec with grep Command
- Bonus tip: Find with multiple exec commands
- Conclusion
- Linux find file and exec
- Параметры программы find
- Действия
- Примеры использования find с параметром exec
- Заключение
How to Use the find Command With exec
Find works on searching files based on a number of criteria. The exec command gives you the ability to work on those results. Here are some examples of find exec command combination.
You can take your findings to the next level by actually doing specific operations on the found files.
For example, you found all the files with .jpeg extension. How about renaming them with .jpg extension?
You cannot just pipe redirect the find command output to another command. It won’t work that simply.
You have two ways to execute other commands on the result of the find command:
There is already a detailed article on xargs command. This tutorial will focus on combining find and exec commands.
Using exec command with the output of find command
The basic syntax to execute find with exec is as follows:
find [path] [arguments] -exec [command] <> \;
Here’s a quick explanation:
- [command] is what you want to execute over results given by the find command.
- <> is a placeholder that is used to hold results given by the find command.
- \; says that for each found result, the [command] is executed. You need to escape the ; here and hence \;.
There is another syntax that is slightly different from the above and is as follows:
find [path] [arguments] -exec [command] <> +
Here, + says for every result of the find command, the [command] is executed only once. All the results are passed to the [command] as arguments together. + does not need to be escaped with \+ .
Still confused about the use of <> \; and <> + ?
<> \; is like this (executing the commands for each found result):
ls file1.txt ls file2.txt ls file3.txt
<> + is like this (executing the command once with all results argument):
ls file1.txt file2.txt file3.txt
While it may seem like using <> + is the better option here, it’s the opposite. If the find commands throw 50 results, you cannot pass them all as arguments together because there are restrictions on maximum command line length.
This is why you are better with <> \; unless you know exactly what you need.
Practical examples of combining find and exec commands
Let me share some common examples of find exec commands so that you can understand them better.
1. Find and display file attributes
In the first simple example of find exec command, I am going to display all the lock files that are under the /tmp directory and display their properties.
sudo find /tmp/ -type f -name *lock -exec ls -l <> \;
[email protected]:~$ sudo find /tmp/ -type f -name *lock -exec ls -l <> \; -r--r--r-- 1 gdm gdm 11 Jul 17 08:01 /tmp/.X1024-lock -r--r--r-- 1 gdm gdm 11 Jul 17 08:01 /tmp/.X1025-lock
2. Find and rename files
Yes, using find with exec you can rename files easily. The mv command is used for renaming the files. I’ll be doing the same.
sudo find /home/sagar/Downloads/ -type f -name 'ubuntu*' -exec mv <> <>_renamed \;
The above command finds the files that start with the name ubuntu and store them inside the placeholder. Once the process of storing results inside the placeholder, it will add «_renamed» at the end of each file stored inside the placeholder.
3. Collect and store file sizes
In this example, I will show you how you can collect the size of available files under a certain directory and create a file to save the given output.
I will collect each file’s size under the /tmp directory and save the output under the /root directory with the filename of du_data.out
sudo find /tmp/ -type f -exec du -sh <> \; > /root/du_data.out
Now, let’s have a look at what the recently created file under /root directory looks like.
4. Remove files with specific parameters
Please be extra careful while automatically removing files. It could be catastrophic if you don’t pay attention. Either use the interactive delete with rm -i or see the result of the find command first.
Another common example of the find exec command combination is to find files greater than a certain size and remove them. This works well if you are cleaning old logs.
I am removing files larger than 100 MB for demonstration under my Desktop directory.
find ~/Desktop -size +100M -exec rm <> \;
Similarly, you can also remove files based on how old they are. For example, let’s remove files that are older than 10 days.
sudo find /tmp/ -type f -mtime +10 -exec rm <> \;
Here I used -mtime which identifies data modified in the last 24 hours and when paired +10 with it, it found and deleted files that are older than 10 days.
5. Execute specific tools
There are various cases where you may want to start certain tools or packages after finding the files.
For example, when I’m searching for any mp3 file, I want to run id3v2 which will bring details about found mp3 file.
find . -name "*.mp3" -exec id3v2 -l <> \;
id3v2 is the package that will show the details about the mp3 file and -l is used to show each mp3 tag associated with found mp3.
6. Change the ownership of files and directories
Changing the ownership of files and directories is another example of how powerful the combination of find and exec is.
Here, I am looking for the files owned by the user named sagar and then change their ownership to milan .
sudo find /home/sagar/disk/Downloads -user sagar -type f -exec chown milan <> \;
7. Changing the permission of files
So how about changing permissions of files using find and exec?
sudo find /home/sagar/disk/Downloads -type f -exec chmod 644 <> \;
In the above command, I used -type f so the command will only be applied to files under the given directory.
8. Collect md5sum for each file
In this example, I will demonstrate how you can collect md5sum for each available file under the /tmp directory.
sudo find /tmp/ -type f -exec md5sum <> \;
As you can see, the applied command collected md5sum for each available file with their names and md5sum.
But what if you want to save this output and to certain directly with a different name? you just have to follow the given command and change names directly accordingly:
sudo find /tmp/ -type f -exec md5sum <> \; > /Documents/checksumdata.out
9. Combine exec with grep Command
The find command works on the file names. The grep command works on the contents of the files.
Combine the find and grep together with exec and you got yourself a powerful search tool in the Linux command line.
For example, the command below searches for all the files that have .hbs extension. With grep, it searches inside the content of those .hbs files for the string ‘excerpt’.
find . -type f -name "*.hbs" -exec grep -iH excerpt <> \;
With the -H option, grep command will show the file names for each match. Here’s the output:
[email protected]:~/Downloads/casper-hyvor$ find . -type f -name "*.hbs" -exec grep -iH excerpt <> \; ./author.hbs:>./partials/post-card.hbs: > ./partials/post-card.hbs:>./post.hbs: > ./post.hbs:>
./tag.hbs:
Bonus tip: Find with multiple exec commands
Yes, you can chain multiple exec commands with single find command.
Let me take the same example that you saw in the previous section and use two exec commands.
find . -type f -name "*.hbs" -exec echo <> \; -exec grep excerpt <> \;
It’ll search for the .hbs files first and then echo their name with first exec command. And then, those files will be searched for the «excerpt» string.
The output will be slightly different than the one in the previous command:
[email protected]:~/Downloads/casper-hyvor$ find . -type f -name "*.hbs" -exec echo <> \; -exec grep excerpt <> \; ./index.hbs ./page.hbs ./default.hbs ./author.hbs>./error-404.hbs ./error.hbs ./partials/icons/twitter.hbs ./partials/icons/fire.hbs ./partials/icons/lock.hbs ./partials/icons/loader.hbs ./partials/icons/rss.hbs ./partials/icons/avatar.hbs ./partials/icons/facebook.hbs ./partials/post-card.hbs >>./post.hbs >>
./tag.hbs
Conclusion
Find is an already powerful command for searching files based on a number of criteria. The exec command gives you the ability to work on the result of the find command.
The examples I shared here are just a glimpse. Together, the find-exec command combination gives you endless possibilities for doing things in the Linux command line.
Linux find file and exec
Библиотека сайта rus-linux.net
locate является программа find : GNU find обходит каждый файл из дерева директорий, подставляя его имя в заданное выражение и проводит вычисление значения выражения слева до получения результата (правая часть выражения ложна для операции логического «и», истинна для логического «или»), на основании которого find принимает решение о выполнении заданного действия и переходит к рассмотрению следующего имени файла.
Программа find может принимать различные аргументы командной строки для создания выражения поиска, а стандартным действием при обнаружении файла с именем, удовлетворяющим выражению, является печать имени файла.
Перед тем, как как привести полезные примеры использования программы find с параметром exec , рассмотрим немного теоретических положений.
Параметры программы find
Наиболее известными параметрами для поиска файлов при помощи программы find , являются:
-name выражение Это наиболее часто используемый параметр для поиска файлов, имена которых (без учета предшествующих им директорий) удовлетворяют заданному выражению.
-mtime n Файлы были изменены n*24 часов назад.
- ‘b’ для блоков по 512 байт (используется по умолчанию если суффикс не задан)
- ‘c’ для байт
- ‘w’ для двухбайтовых слов
- ‘k’ для Килобайт (единицы размером в 1024 байта)
- ‘M’ для Мегабайт (единицы размером в 1048576 байт)
- ‘G’ для Гигабайт (единицы размером в 1073741824 байт)
-uid n Системный числовой идентификатор пользователя-владельца файла должен быть равен n .
Действия
При использовании find есть возможность для указания действий, которые будут выполнены при нахождении файла с именем, удовлетворяющим выражению поиска, а наиболее гибким вариантом, без сомнения, является использование параметра exec .
-exec команда; Выполнить команду; выполнение считается успешным в случае статуса выхода, равного нулю. Все символы, следующие за командой, считаются ее аргументами до того момента, как встречается символ «;» . Строка «<>» заменяется на имя рассматриваемого файла каждый раз, когда она встречается среди аргументов команды.
Примеры использования find с параметром exec
Поиск файлов и удаление их при помощи параметра exec является часто встречающимся вариантом использования этого параметра, но вам не нужно использовать exec для этих целей, так как более удачный вариант будет описан позднее.
find / -name "*.old" -exec /bin/rm <> \;
find / -size +100M -exec /bin/rm <> \;
Бывают и такие случаи, что программы «сходят с ума» и заполняют директории тысячами мелких файлов, при этом вы не сможете просто использовать команду rm * по той причине, что командная оболочка не в состоянии заменить символ * на имена всех этих файлов, зато в состоянии удалить эти файлы по очереди:
Помните, что вы не должны использовать эти примеры, поскольку для удаления файлов у GNU find есть параметр -delete , более безопасный, нежели «-exec /bin/rm <>;» . Пример использования:
В старых системах Unix у вас не будет возможности использовать параметр -delete , поэтому альтернатив параметру -exec для удаления файлов в них не остается.
А теперь рассмотрим некоторые другие примеры использования программы find с параметром exec .
find ./ -type f -exec chmod 644 <> \;
При помощи параметра -type f вы можете вести поиск только файлов и просто изменять права доступа к каждому из них при помощи chmod .
find / -user olduser -type f -exec chown newuser <> \;
В этом примере я использовал параметр -user как альтернативу параметру -uid .
find . -type d -exec chmod 755 <> \;
В этом примере я снова использовал параметр -type , но на этот раз с аргументом d для поиска директорий.
Заключение
Как вы убедились, в приведенных выше примерах показано то, что использование программы find с параметром exec позволяет вам выполнять довольно сложные задачи, при этом то обстоятельство, что вы можете выполнять заданное действие только над частью файлов, ставит вас в выигрышное положение.