как slickslice много оболочки сценария папки? [Дубликат]

В Python 2.7

Нарезка в Python

[a:b:c]

len = length of string, tuple or list

c -- default is +1. The sign of c indicates forward or backward, absolute value of c indicates steps. Default is forward with step size 1. Positive means forward, negative means backward.

a --  When c is positive or blank, default is 0. When c is negative, default is -1.

b --  When c is positive or blank, default is len. When c is negative, default is -(len+1).

Очень важно понимать назначение индекса.

In forward direction, starts at 0 and ends at len-1

In backward direction, starts at -1 and ends at -len

Когда вы говорите [a: b : c], вы говорите в зависимости от знака c (вперед или назад), начинайте с a и заканчивая на b (исключая элемент в bth-индексе). Используйте правило индексирования выше и помните, что вы найдете только элементы в этом диапазоне:

-len, -len+1, -len+2, ..., 0, 1, 2,3,4 , len -1

Но этот диапазон продолжается в обоих направлениях бесконечно:

...,-len -2 ,-len-1,-len, -len+1, -len+2, ..., 0, 1, 2,3,4 , len -1, len, len +1, len+2 , ....

Например:

             0    1    2   3    4   5   6   7   8   9   10   11
             a    s    t   r    i   n   g
    -9  -8  -7   -6   -5  -4   -3  -2  -1

Если ваш выбор a, b и c позволяет перекрываться с вышеприведенным диапазоном при использовании правил для a, b, c выше, вы либо получите список с элементами (затронутыми во время обхода), либо вы получите пустой список.

Последнее: если a и b равны, то вы также получите пустой список:

>>> l1
[2, 3, 4]

>>> l1[:]
[2, 3, 4]

>>> l1[::-1] # a default is -1 , b default is -(len+1)
[4, 3, 2]

>>> l1[:-4:-1] # a default is -1
[4, 3, 2]

>>> l1[:-3:-1] # a default is -1
[4, 3]

>>> l1[::] # c default is +1, so a default is 0, b default is len
[2, 3, 4]

>>> l1[::-1] # c is -1 , so a default is -1 and b default is -(len+1)
[4, 3, 2]


>>> l1[-100:-200:-1] # Interesting
[]

>>> l1[-1:-200:-1] # Interesting
[4, 3, 2]


>>> l1[-1:-1:1]
[]


>>> l1[-1:5:1] # Interesting
[4]


>>> l1[1:-7:1]
[]

>>> l1[1:-7:-1] # Interesting
[3, 2]

>>> l1[:-2:-2] # a default is -1, stop(b) at -2 , step(c) by 2 in reverse direction
[4]
15
задан CodeCaster 17 July 2012 в 12:38
поделиться

7 ответов

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

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

Например, чтобы найти каталоги, находящиеся под одной ячейкой 'm в настоящее время:

find . -type d -exec echo "Hello, '{}'" \;

Который получит мне что-то вроде:

Hello, '.'
Hello, './.libs'
Hello, './include'
Hello, './autom4te.cache'
Hello, './build'
Hello, './modules'

То же самое, чтобы найти файлы в текущем каталоге:

find . -type f -exec echo "Hello, '{}'" \;

, который получит мне что-то вроде этого:

Hello, './config.guess'
Hello, './config.sub'
Hello, './.libs/memcache_session.o'
Hello, './.libs/memcache_standard_hash.o'
Hello, './.libs/memcache_consistent_hash.o'
Hello, './.libs/memcache.so'
Hello, './.libs/memcache.lai'
Hello, './.libs/memcache.o'
Hello, './.libs/memcache_queue.o'
Hello, './install-sh'
Hello, './config.h.in'
Hello, './php_memcache.h'
...

Некоторые скажут: «Это не оболочка» ... Но зачем же изобретать колесо? (И в некотором смысле это оболочка ^^)

Для получения дополнительной информации вы можете посмотреть:

41
ответ дан Abizern 27 August 2018 в 10:28
поделиться

Для большинства рекурсивных операций с файлами вы хотите использовать find, как объясняют другие ответы.

Существует пример рекурсивного скрипта bash, включенного в bash-doc . Если вы установили эти примеры, это будет в /usr/share/doc/bash/examples/functions/recurse (на Debian).

0
ответ дан ire_and_curses 27 August 2018 в 10:28
поделиться

Извините, я не понимаю, о чем вы спрашиваете. Лучшее, что я могу догадаться с вашим вопросом:

find -type d -exec scriptname.sh \{\} \;
3
ответ дан Michael Lloyd Lee mlk 27 August 2018 в 10:28
поделиться

Некоторые базовые оболочки пропускают команды вроде «find», а некоторые из их команд не поддерживают рекурсию. В этом случае вы можете использовать этот скрипт для запуска нужной команды во всех поддиректорах в дереве:

CDIR=$(pwd)
for i in $(ls -R | grep :); do
    DIR=${i%:}                    # Strip ':'
    cd $DIR
    $1                            # Your command
    cd $CDIR
done

Если вы назовете вышеупомянутое «recurse.sh», используйте:

./recurse.sh <command>

Пример (измените владельца / группу на «root» всех файлов в дереве):

./recurse.sh "chown 0:0 *"
3
ответ дан Paolo Santos 27 August 2018 в 10:28
поделиться

Посмотрите на команду find и проверьте переключатели -type (используйте d для указания каталога) и -exec (чтобы указать команду для выполнения).

1
ответ дан Simon Groenewolt 27 August 2018 в 10:28
поделиться

Bash 4.0 представила опцию globstar, поэтому такая конструкция, как:

for f in mydir/**/*
do
  # operations here
done

... будет действовать рекурсивно на любые земли в $ f. Включите это с помощью «shopt-globstar», в противном случае ** будет рассматриваться как единственное *.

Нашел этот драгоценный камень сегодня в http://www.linuxjournal.com/content/ globstar-new-bash-globbing-option , после того как он вдохновлен конструкцией zsh (по умолчанию я включил ее).

8
ответ дан Trey Blancher 27 August 2018 в 10:28
поделиться

Что-то вроде этого должно достичь вашей цели:

function RecurseDirs
{
    oldIFS=$IFS
    IFS=$'\n'
    for f in "$@"
    do
    -----your activity here-----
        if [[ -d "${f}" ]]; then
            cd "${f}"
            RecurseDirs $(ls -1 ".")
            cd ..
        fi
    done
    IFS=$oldIFS
}
7
ответ дан Zuul 27 August 2018 в 10:28
поделиться
Другие вопросы по тегам:

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