Выполнитесь на базовом имени команды находки

Я не думаю, что можно выполнить итерации по нескольким вещам параллельно в ударе.

Я начал бы 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
3
30.05.2012, 10:34
5 ответов

Попробуйте 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
1
27.01.2020, 21:10

Выполните удар.

find ... -exec bash -c 'touch "${1##*/}"' btouch {} \;

Здесь ${1##*/} средства: удалите самое долгое соответствие из второго аргумента, заканчивающегося a /, таким образом сохраняя все после последнего /.

btouch может быть любое фиктивное имя, чтобы заставить его появиться правильно в активном списке процессов (ps)

4
27.01.2020, 21:10
  • 1
    Этот не работает на меня. touch: missing file operand. Кроме того, что 1##* и btouch? –  Bernhard 30.05.2012, 10:03
  • 2
    Фиксированный. Расширение параметра. $0. –  Ignacio Vazquez-Abrams 30.05.2012, 10:03
  • 3
    Это работает действительно, можно ли объяснить немного почему? Особенно это 1##* Это должно разделить путь? –  Bernhard 30.05.2012, 10:09
  • 4
  • 5
    Поскольку это выглядит глупым. Плюс, $0 обнаруживается в ps и т.п., так, чтобы можно определить дочерний процесс. –  Ignacio Vazquez-Abrams 30.05.2012, 10:51

Попробуйте это на Ваш собственный риск:

find test -type f -exec echo touch \"\$\(basename "'{}'"\)\" \; | bash

Протестированный с именами файлов с пробелами.

3
27.01.2020, 21:10

Как насчет этого?

$ touch $(find test -type f -exec basename {} \;)
1
27.01.2020, 21:10
  • 1
    Предположим что мой touch управляйте только берет один аргумент за один раз? –  Bernhard 30.05.2012, 10:06
  • 2
    Повредится на именах файлов с пробелом. –  Chris Down 30.05.2012, 12:11

Вызовите оболочку, чтобы сделать немного строковой обработки на пути. Можно использовать ${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)
1
27.01.2020, 21:10

Теги

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