Я не думаю, что можно выполнить итерации по нескольким вещам параллельно в ударе.
Я начал бы i=1
. затем выполните итерации по своему списку файлов и включайте let i=$i+1
в цикле. Также включайте тест для убегания из цикла если $i -ge 736
если Вы хотите выйти из итерации по тому, что Ваш вход после того количества циклов.
i=0
for file in ./{01..10}/*jpg; do
let i=$i+1
mv "$file" "$i-$file"
done
Если бы Вы пытались вполне то после X количества файлов Вы могли бы использовать тест как это:
[[ $i -ge 736 ]] && return || let i=$i+1
Попробуйте execdir
опция для find
: это выполняет команду, которую Вы указываете в каталоге файла, с помощью только его базовое имя в качестве аргумента
Из того, что я собираюсь, Вы хотите создать "a" и "b" в "основном" каталоге. Мы можем сделать это путем объединения $PWD
и -execdir
опция. Взгляните на решение ниже. ( && find … ls
части для вывода только, таким образом, Вы видите эффекты. Вы захотите использовать команду перед &&
.)
Во-первых, я настроил тестовую среду:
-----[ 15:40:17 ] (!6293) [ :-) ] janmoesen@mail ~/stack
$ mkdir test && touch test/{a,b} && find . -exec ls -dalF {} +
drwxr-xr-x 3 janmoesen janmoesen 4096 2012-05-31 15:40 ./
drwxr-xr-x 2 janmoesen janmoesen 4096 2012-05-31 15:40 ./test/
-rw-r--r-- 1 janmoesen janmoesen 0 2012-05-31 15:40 ./test/a
-rw-r--r-- 1 janmoesen janmoesen 0 2012-05-31 15:40 ./test/b
Это - то, что происходит, когда Вы используете простое -exec
— исходные файлы затронуты:
-----[ 15:40:30 ] (!6294) [ :-) ] janmoesen@mail ~/stack
$ find test -type f -exec touch {} \; && find . -exec ls -dalF {} +
drwxr-xr-x 3 janmoesen janmoesen 4096 2012-05-31 15:40 ./
drwxr-xr-x 2 janmoesen janmoesen 4096 2012-05-31 15:40 ./test/
-rw-r--r-- 1 janmoesen janmoesen 0 2012-05-31 15:40 ./test/a
-rw-r--r-- 1 janmoesen janmoesen 0 2012-05-31 15:40 ./test/b
Однако, если мы объединяемся $PWD
с заполнителем аргумента {}
и используйте -execdir
, мы достигаем того, что (я думаю), Вы хотите:
-----[ 15:40:57 ] (!6295) [ :-) ] janmoesen@mail ~/stack
$ find test -type f -execdir touch "$PWD/{}" \; && find . -exec ls -dalF {} +
drwxr-xr-x 3 janmoesen janmoesen 4096 2012-05-31 15:41 ./
-rw-r--r-- 1 janmoesen janmoesen 0 2012-05-31 15:41 ./a
-rw-r--r-- 1 janmoesen janmoesen 0 2012-05-31 15:41 ./b
drwxr-xr-x 2 janmoesen janmoesen 4096 2012-05-31 15:40 ./test/
-rw-r--r-- 1 janmoesen janmoesen 0 2012-05-31 15:40 ./test/a
-rw-r--r-- 1 janmoesen janmoesen 0 2012-05-31 15:40 ./test/b
Выполните удар.
find ... -exec bash -c 'touch "${1##*/}"' btouch {} \;
Здесь ${1##*/}
средства: удалите самое долгое соответствие из второго аргумента, заканчивающегося a /
, таким образом сохраняя все после последнего /
.
btouch
может быть любое фиктивное имя, чтобы заставить его появиться правильно в активном списке процессов (ps
)
touch: missing file operand
. Кроме того, что 1##*
и btouch
?
– Bernhard
30.05.2012, 10:03
1##*
Это должно разделить путь?
– Bernhard
30.05.2012, 10:09
$0
обнаруживается в ps
и т.п., так, чтобы можно определить дочерний процесс.
– Ignacio Vazquez-Abrams
30.05.2012, 10:51
Попробуйте это на Ваш собственный риск:
find test -type f -exec echo touch \"\$\(basename "'{}'"\)\" \; | bash
Протестированный с именами файлов с пробелами.
Как насчет этого?
$ touch $(find test -type f -exec basename {} \;)
touch
управляйте только берет один аргумент за один раз?
– Bernhard
30.05.2012, 10:06
Вызовите оболочку, чтобы сделать немного строковой обработки на пути. Можно использовать ${VARIABLE##PATTERN}
конструкция обработки строк для снятия изоляции с соответствия префикса PATTERN
от VARIABLE
— шаблон */
снимает изоляцию с ведущих имен каталогов.
find test -type f -exec sh -c 'for x; do touch "${x##*/}"; done' _ {} +
Альтернативный метод с находкой GNU должен иметь его изменение в подкаталоги. Вызовите оболочку для возврата к исходному каталогу.
find test -type f -execdir sh -c 'cd "$0" && touch -- "$@"' "$PWD" {} +
Или отбрасывание find
и используйте zsh. А именно, добавьте t
модификатор истории как спецификатор шарика.
touch test/**/*(:t)