Что если я не хочу отображать первый каталог в команде find?

Вопрос или проблема

Я не хочу отображать первые директории команды find из приведенного примера

find . ! -name . -prune -type d -exec sh -c ‘
Для dir do
echo “\n\n${dir#.*/}\n”
find “$dir” -exec md5sum {} +
done’ sh {} + >> ../md5

Пример вывода:

dir1

Значение Md5sum ./dir1/file1

Dir2

Значение Md5sum ./dir2/dir3/file2

Я не хочу отображать первые директории, т.е. ./dir1 и ./dir2, вместо этого я хочу, чтобы find выводил ./file1 и ./dir3/file2

Есть ли способ сделать это?

Спасибо заранее

Ответ или решение

Если вы хотите использовать команду find, чтобы не отображать имя родительской директории (например, ./dir1 и ./dir2), а вместо этого просто вывести имена файлов и поддиректорий, вам нужно изменить ваш код так, чтобы он выводил относительные пути для файлов и папок, начиная не с родительской директории, а с текущей.

Вы можете воспользоваться следующей командой:

find . ! -name . -prune -type f -exec sh -c '
for file do
    echo "${file#./}"
done' sh {} + >> ../md5

В этом примере:

  1. find . ! -name . -prune -type f — команда find ищет файлы (-type f), игнорируя текущую директорию (! -name .).
  2. -exec sh -c '...' sh {} + — это позволяет выполнить команды для каждого найденного файла.
  3. echo "${file#./}" — используется параметрическое подстановка, чтобы убрать ведущие ./ из имени файла, что и позволяет получить желаемый вывод, например, file1 и dir3/file2.

Если вы также хотите обрабатывать поддиректории, модифицируйте find следующим образом:

find . ! -name . -prune -exec sh -c '
for item do
    echo "${item#./}"
done' sh {} + >> ../md5

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

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

Оцените материал
Добавить комментарий

Капча загружается...