Первое число является индексом задания; связанные с заданием команды (jobs
, fg
, и т.д.), используют их. Так, например, если Вы получаете вывод [2] 2847
, Вы могли работать fg 2
к переднему плану то задание.
Насколько я мог сказать от просматривания источника, нет способа отключить сообщение. Одна проверка, которую это действительно делает, должна гарантировать, что оболочка является интерактивной, поэтому при выполнении команды в неинтерактивной оболочке, Вы не получите тот вывод. Например, Вы могли выполнить его в подоболочке:
$ (your_command &)
Это эквивалентно выполнению команды в совершенно другой оболочке, хотя, таким образом, это могло бы иметь другие нежелательные побочные эффекты
Если Вы готовы исправить bash
, можно просто избавиться от который особый вывод. В ударе 4.2 это находится в jobs.c
на строке 1428
:
fprintf (stderr, "[%d] %ld\n", job + 1, (long)pid);
Это называют при других обстоятельствах; если Вы просто хотите, который уводят для этого конкретного случая, можно прокомментировать execute_cmd.c
, строка 762
:
DESCRIBE_PID (last_made_pid);
Если необходимо выбрать более определенные файлы, чем только использование каталогов find
и передайте его while read
:
shopt -s dotglob
find * -prune -type d | while IFS= read -r d; do
echo "$d"
done
Использовать shopt -u dotglob
исключить скрытые каталоги (или setopt dotglob
/unsetopt dotglob
в zsh).
IFS=
постараться не разделять имена файлов, содержащие один из $IFS
, например: 'a b'
см. ответ AsymLabs ниже для больше find
опции
править:
В случае, если необходимо создать стоимость выхода из цикла с условием продолжения, можно обойти дополнительную подоболочку этим приемом:
while IFS= read -r d; do
if [ "$d" == "something" ]; then exit 1; fi
done < <(find * -prune -type d)
Можно указать наклонную черту в конце для соответствия только каталогам:
for d in */ ; do
echo "$d"
done
[[ -L $d ]]
является ли $d символьной ссылкой.
– choroba
15.08.2013, 02:00
set -P
только команды влияния, которые изменяют каталог. Sprunge.us/TNac
– Chris Down
22.10.2013, 09:14
[[ -L "$f" ]]
не исключит символьные ссылки в этом случае с */
, необходимо разделить запаздывающую наклонную черту с [[ -L "${f%/}" ]]
(см. Тест для ссылки с запаздывающей наклонной чертой)
– rubo77
23.10.2013, 09:54
Можно протестировать с -d
:
for f in *; do
if [ -d "$f" ]; then
# $f is a directory
fi
done
Это - один из тестовых операторов файла.
Можно использовать чистый удар для этого, но лучше использовать, найдите:
find . -maxdepth 1 -type d -exec echo {} \;
(найдите, дополнительно будет включать скрытые каталоги),
shopt -s dotglob
для bash
включать скрытые каталоги. Ваш будет также включать .
. Также отметьте это -maxdepth
не стандартная опция (-prune
).
– Stéphane Chazelas
14.08.2013, 19:11
dotglob
опция интересна, но dotglob
только относится к использованию *
. find .
будет всегда включать скрытые каталоги (и текущий dir также) ре
– rubo77
22.10.2013, 08:28
Это сделано для нахождения и видимых и скрытых каталогов в рамках существующего рабочего каталога, исключая корневой каталог:
только к циклу через каталоги:
find -path './*' -prune -type d
включать символьные ссылки в результат:
find -L -path './*' -prune -type d
сделать что-то к каждому каталогу (исключая символьные ссылки):
find -path './*' -prune -type d -print0 | xargs -0 <cmds>
исключить скрытые каталоги:
find -path './[^.]*' -prune -type d
выполнить несколько команд на возвращаемом значения (очень изобретенный пример):
find -path './[^.]*' -prune -type d -print0 | xargs -0 -I '{}' sh -c \
"printf 'first: %-40s' '{}'; printf 'second: %s\n' '{}'"
вместо 'sh-c' может также использовать 'удар-c', и т.д.
... -print0 | xargs -0 ...
если Вы не знаете, каковы точные имена.
– Anthon
21.10.2013, 07:50
find * | while read file; do ...
– rubo77
22.10.2013, 07:37
Можно циклично выполниться через все каталоги включая скрытые каталоги (начинающийся с точки) в одной строке и нескольких командах с:
for file in */ .*/ ; do echo "$file is a directory"; done
Если Вы хотите исключить символьные ссылки:
for file in *; do
if [[ -d "$file" && ! -L "$file" ]]; then
echo "$file is a directory";
fi;
done
примечание: использование списка */ .*/
работы в ударе, но также и дисплеи папки .
и ..
в то время как в zsh это не покажет их, но бросит ошибку, если не будет никакого скрытого файла в папке
Более чистая версия, которая будет включать скрытые каталоги и исключать../, будет с dotglob опцией:
shopt -s dotglob
for file in */ ; do echo "$file is a directory"; done
(или setopt dotglob
в zsh)
можно сбросить dotglob с
shopt -u dotglob
Использовать find
с -exec
циклично выполняться через каталоги и вызывать функцию в исполнительной опции:
dosomething () {
echo "doing something with $1"
}
export -f dosomething
find -path './*' -prune -type d -exec bash -c 'dosomething "$0"' {} \;
Использовать shopt -s dotglob
или shopt -u dotglob
включать/исключать скрытые каталоги
Это будет включать полный путь в каждый каталог в списке:
for i in $(find $PWD -maxdepth 1 -type d); do echo $i; done
Помните, что решение choroba, хотя и элегантно, может вызвать неожиданное поведение, если в текущем каталоге нет доступных каталогов. В этом состоянии вместо того, чтобы пропускать цикл for
, bash выполнит цикл ровно один раз, где d
равно * /
:
#!/usr/bin/env bash
for d in */; do
# Will print */ if no directories are available
echo $d
done
Я рекомендую использовать следующее для защиты от этого случая:
#!/usr/bin/env bash
for f in *; do
if [ -d ${f} ]; then
# Will not run if no directories are available
echo $f
fi
done
Этот код будет перебирать все файлы в текущем каталоге, проверять, является ли f
каталогом, затем echo f
, если условие возвращает true . Если f
равно * /
, echo $ f
не будет выполняться.
ls -l | grep ^d
или:
ll | grep ^d
Вы можете установить его как псевдоним
Этот ответ предполагает, что все , что нужно сделать, это найти подкаталоги -некоторого верхнего -каталога уровня.
Ответ, относящийся кbash
(и в некоторой степени zsh
оболочке ), см. во второй части вики-ответа rubo77 , где dotglob
и nullglob
используется для правильного перебора каталогов (или символических ссылок на каталоги )в одном каталоге.
Для портативного решения, которое не зависит от bash
для фактического выбора файлов, вы можете использовать find
для циклического перебора всех каталогов в некотором каталоге верхнего -уровня:
topdir=.
find "$topdir" ! -path "$topdir" -prune -type d -exec sh -c '
for dirpath do
# user code goes here, using "$dirpath"
printf "\"%s\" is a directory\n" "$dirpath"
done' sh {} +
В приведенном выше коде предполагается, что интересующий нас верхний каталог — это текущий каталог(.
). Установите topdir
на какой-либо другой путь, чтобы использовать его в другом каталоге.
Утилите find
предлагается игнорировать пути, идентичные начальному пути поиска с ! -path "$topdir"
, а затем сократить (и не вводить )любые другие найденные пути. Это ограничивает поиск только каталогом, на который ссылается $topdir
.
Пути, которые являются каталогами (-type d
), собираются, и sh -c
скрипт выполняется с их пакетами в качестве аргументов. Сценарий sh -c
— это код, который мы хотели бы выполнить для всех каталогов, поэтому он выполняет итерацию по заданным аргументам и делает с каждым из них все, что нужно. Если вам нужно сделать что-то, что требует bash
, вы, очевидно, вместо этого используете bash -c
.
Сценарий sh -c
можно было бы выделить в отдельный сценарий вот так:
#!/bin/sh
for dirpath do
# user code goes here, using "$dirpath"
printf '"%s" is a directory\n' "$dirpath"
done
... который будет вызываться из find
вот так:
find "$topdir" ! -path "$topdir" -prune -type d -exec./myscript.sh {} +
См. также:
Список только каталогов. включительно с пробелами в именах включать скрытый каталог -A
при необходимости:
grep '/$' <(ls -AF)
Возможные продолжения:
| xargs -I{} echo {}
| while read; do echo $REPLY; done
Но судя по каверзному вопросу имелся в виду вывод каталогов в цикле for
и средствами шелла:
for i in */.[^.]*/; do
[ -h "${i%?}" ] || echo $i
done