найдите-maxdepth 0 не возврат меня любой вывод

Смотрите на целый пользовательскую/группу/другого материал в Unix, который мог бы помочь. Но похоже, что Вы хотите настроить материал, который является очень неловким для больше, чем нескольких групп. Возможно, то, в чем Вы нуждаетесь, является более прекрасной гранулярностью как ACL (Списки управления доступом) предложение относительно некоторых файловых систем. Проверьте страницы руководства для acl (5), setfacl (1) и соседние.

18
16.10.2014, 07:01
3 ответа

Если на случайном этапе вы просто пытаетесь обработать кавычки для повторного использования оболочки, то вы можете сделать это , не удаляя их , и это также просто:

aq() { sh -c 'for a do
       alias "$((i=$i+1))=$a"
       done; alias' -- "$@"
}

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

Здесь это с несколькими аргументами:

aq \
"here's an
ugly one" \
"this one is \$PATHpretty bad, too" \
'this one```****```; totally sucks'

OUTPUT

1='here'"'"'s an
ugly one'
2='this one is $PATHpretty bad, too'
3='this one```****```; totally sucks'

Этот выход из тире , который, как правило, безопасно кавычки в одной кавычке, как '«'» '. bash будет выполнять '\" .

В любой оболочке POSIX с $ IFS и $ * можно быстрее всего заменить набор байтов, отличных от пустых и пустых.

set -f; IFS=\"\'\`; set -- $var; printf %s "$*"

OUTPUT

"some ""crazy """"""""string ""here

Там я просто printf это, чтобы вы могли видеть, но, конечно, если бы я сделал:

var="$*"

..., а не printf команда $ var значение будет то, что вы видите на выходе там.

Когда я задаю -f , я инструктирую оболочку не на glob - в случае, если последовательность содержит символы, которые можно истолковать как glob узоров. Я делаю это, потому что синтаксический анализатор оболочек расширяет паттерны глоба после он выполняет разделение поля на переменные. глоббинг может быть повторно включен, как набор + f . В общем - в сценариях - я считаю полезным задать свой удар, как:

#!/usr/bin/sh -f

И затем явно включить глоббинг с установить + f на любой строке, которую я мог бы захотеть.

Разделение полей выполняется на основе символов в $ IFS .

Существует два вида значений $ IFS - $ IFS пробел и $ IFS пробел. $ IFS пробел (космос, табуляция, новая строка) разделенные поля определяются как разделяемые последовательностью на одно поле (или вообще отсутствуют, если они не предшествуют чему-либо другому) - так что...

IFS=\ ; var='      '; printf '<%s>' $var
<>

Но все остальные указаны для вычисления одного поля в каждом случае - они не усечены.

IFS=/; var='/////'; printf '<%s>' $var
<><><><><>

Все расширения переменных по умолчанию представляют собой массивы данных с разделителями $ IFS - они разделены на отдельные поля в соответствии с $ IFS . Когда вы " - цитируете одно из них, вы переопределяете это свойство массива и оцениваете его как один ряд.

Так что, когда я это делаю...

IFS=\"\'\`; set -- $var

Я настройкой массив аргументов оболочки к множеству полей $ IFS , разделенных расширением $ var . При расширении его составляющих значений для символов, содержащихся в $ IFS , теряется - теперь они являются только разделителями полей - \0NUL .

«$ *» - как и другие переменные расширения с двойными кавычками - также переопределяет качества разделения поля $ IFS . Но, в дополнение ,он заменяет первый байт в $ IFS для каждого разделенного поля в «$ @» . Так как « было первым значением в $ IFS все последующие разделители становятся » в «$ *» . И " не обязательно находиться в $ IFS при разделении. Можно полностью изменить $ IFS после наборов -- $ args на другое значение, и его новый первый байт появится для разделителей полей в «$ *» . Более того, можно удалить все следы, как

set -- $var; IFS=; printf %s "$*"

OUTPUT

some crazy string here
-121--24039-

Команда find имеет для этого переключатель. Он называется -exec .

$ find . -name '*.dcm' -exec dcmdjpeg {} {} \;

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

dcmdjpeg file1.dcm file1.dcm
dcmdjpeg file2.dcm file2.dcm
...

Если в именах файлов имеются места, можно использовать следующий метод:

$ find . -name '*.dcm' -exec dcmdjpeg "{}" "{}" \;

Просмотр происходящего

Можно заменить команду dcmdjpeg командой echo и выполнить приведенное выше для просмотра имен файлов, которые будут выполнены.

Пример

Скажем, что у меня были эти данные образца.

$ tree
.
|-- 1
|   |-- 1.dcm
|   |-- 1\ space.dcm
|   |-- 2.dcm
|   `-- 3.dcm
|-- 1.dcm
|-- 2
|   |-- 1.dcm
|   |-- 1\ space.dcm
|   |-- 2.dcm
|   `-- 3.dcm
|-- 2.dcm
|-- 3
|   |-- 1.dcm
|   |-- 1\ space.dcm
|   |-- 2.dcm
|   `-- 3.dcm
`-- 3.dcm

И теперь, когда мы запускаем 2-й пример, который обрабатывает места в именах файлов:

$ find . -name '*.dcm' -exec echo "{}" "{}" \;
./2.dcm ./2.dcm
./1/2.dcm ./1/2.dcm
./1/3.dcm ./1/3.dcm
./1/1 space.dcm ./1/1 space.dcm
./1/1.dcm ./1/1.dcm
./3.dcm ./3.dcm
./1.dcm ./1.dcm
./2/2.dcm ./2/2.dcm
./2/3.dcm ./2/3.dcm
./2/1 space.dcm ./2/1 space.dcm
./2/1.dcm ./2/1.dcm
./3/2.dcm ./3/2.dcm
./3/3.dcm ./3/3.dcm
./3/1 space.dcm ./3/1 space.dcm
./3/1.dcm ./3/1.dcm

В приведенном выше вы можете увидеть, как имена файлов повторяются дважды на каждый найденный файл.

-121--139945-

Предположим, что в текущем каталоге имеется файлов1 . Затем:

$ find . -maxdepth 0 -name "file1"
$ find . file1 -maxdepth 0 -name "file1"
file1

Теперь рассмотрим, что говорится в документации:

-maxdepth 0 означает только применение тестов и действий к аргументам командной строки.

В моем первом примере выше только каталог . отображается в командной строке. С . не имеет имени file1 , в выходных данных ничего не указано. В моем втором примере выше оба . и file1 перечислены в командной строке, и, поскольку file1 соответствует -имя «file1» , он был возвращен в выходных данных

Другими словами, -maxdepth 0 означает не поиск каталогов или подкаталогов. Вместо этого следует искать только соответствующий файл среди файлов, явно перечисленных в командной строке.

В примерах в командной строке были перечислены только каталоги, ни один из которых не был назван file1 . Следовательно, никаких выходных данных.

Как правило, в командной строке можно присвоить имена многим файлам и каталогам. Например, здесь мы попробуем команду find с 11 файлами и каталогами в командной строке:

$ ls
d1  file1  file10  file2  file3  file4  file5  file6  file7  file8  file9
$ find d1 file1 file10 file2 file3 file4 file5 file6 file7 file8 file9 -maxdepth 0 -name "file1"
file1

Перекрывающиеся пути

Рассмотрим:

$ find . file1 -maxdepth 0 -iname file1
file1
$ find . file1 file1 -maxdepth 0 -iname file1
file1
file1
$ find . file1 file1 -maxdepth 1 -iname file1
./file1
file1
file1

Видимо, как указывает Рамеш, find будет следовать по каждому пути, указанному в командной строке, и искать совпадения, даже если пути ведут к тому же файлу, как в . файл или даже если пути являются точными дубликатами, как в file1 file1 .

26
27.01.2020, 19:46

Если вы хотите не -рекурсивно находить файлы (не каталоги )внутри каталога, используйте:

find. -maxdepth 1 -type f -name "file1"
#./file1

-maxdepth 0не будет искать . Он будет пытаться сопоставить только те имена файлов/каталогов, которые вы указали в качестве аргументов в find.

. в приведенном выше выражении, используя значение maxdepthдля 0, попытается сопоставить file1с ., которое не соответствует.

Однако передача *вместо .в сочетании с -maxdepth 0заставит bash заменить *списком файлов в текущем каталоге, что вернет совпадение.

2
25.01.2021, 11:15
Использование :

John1024 дал хорошие примеры, как использовать -maxdepth 0, поэтому я добавляю информацию только тогда, когда ее использовать:

А в чем причина -maxdepth 0? Если вы знаете имя, вы можете просто ввести команду

ls file-* 

Ну, это может быть не то имя, которое вы ищете.

Пример:

touch file-{1..3}
echo "1" > file-1
touch -d @0 file-2

find * -maxdepth 0 -name "file-*" \( -size 1k -o -mtime +10000 \) -ls 
   669266     12 -rw-rw-r--   1 stefan   stefan          2 Mai  4 20:57 file-1
   669270      8 -rw-rw-r--   1 stefan   stefan          0 Jan  1  1970 file-2

Я создаю 3 файла с именем файла шаблона -*. Затем я добавляю некоторый контент в no. 1, сбросьте дату для нет. 2 и оставить нет. 3 как есть.

Теперь я ищу файлы размером 1 КБ (№ 1 )или возрастом > примерно 30 лет в тысячах файлов. Например, всего среди 3 файлов.

Но find *ищет каждый файл в текущем каталоге, отсюда несколько чуждый жаргон справочной страницы, "начальная точка", вместо того, чтобы просто говорить о каталогах. Я предполагаю, что мощные функции фильтрации find привели к решению искать файлы, местонахождение которых известно ($PWD ), но вы не можете легко фильтровать другие атрибуты со стандартными инструменты оболочки.

0
04.05.2021, 19:13

Теги

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