В 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]
Если вы хотите записаться в каталоги, выполнив команду для каждого найденного в них файла, я бы использовал команду 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'
...
Некоторые скажут: «Это не оболочка» ... Но зачем же изобретать колесо? (И в некотором смысле это оболочка ^^)
Для получения дополнительной информации вы можете посмотреть:
man find
Для большинства рекурсивных операций с файлами вы хотите использовать find
, как объясняют другие ответы.
Существует пример рекурсивного скрипта bash, включенного в bash-doc . Если вы установили эти примеры, это будет в /usr/share/doc/bash/examples/functions/recurse
(на Debian).
Извините, я не понимаю, о чем вы спрашиваете. Лучшее, что я могу догадаться с вашим вопросом:
find -type d -exec scriptname.sh \{\} \;
Некоторые базовые оболочки пропускают команды вроде «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 *"
Посмотрите на команду find
и проверьте переключатели -type
(используйте d для указания каталога) и -exec
(чтобы указать команду для выполнения).
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 (по умолчанию я включил ее).
Что-то вроде этого должно достичь вашей цели:
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
}