Можно ли создать цикл, который создает переменную из каждого имени каталога в каталоге, когда каталоги не всегда совпадают?

Curl, если вы хотите использовать его для доступа к URL-адресам, поддерживает URL-адреса с диапазонами:

curl... 'https://bitcointalk.org/index.php?topic=840124.[0-4240]'

Где ...— другие параметры, которые вы можете использовать.

Синтаксис диапазона также допускает пошаговое приращение, отличное от 1. Например, чтобы получить каждый 20-й URL:

curl... 'https://bitcointalk.org/index.php?topic=840124.[0-4240:20]'

Дополнительную информацию см. в руководстве curl.

Чтобы сгенерировать список URL-адресов для отдельной обработки с помощью curlили какой-либо другой программы, рассмотрите возможность использования расширения скобок (, если ваша оболочка поддерживает это):

printf '%s\n' 'https://bitcointalk.org/index.php?topic=840124.'{0..4240}

С bashи некоторыми другими оболочками можно использовать приращение, как в '...URL...'{0..4240..20}.

Затем список может быть передан, например,. xargs, который может вызывать вашу curlили другую программу с URL-адресами в качестве аргументов.

1
11.04.2020, 07:23
2 ответа

Используя rsyncи предполагая, что вы хотите жестко связать все .mkvфайлы в каталоге sourceили под ним в каталог target, включая создание всех каталогов (, даже если они пусты из .mkvфайлов ).

rsync --archive --link-dest="$PWD/source" \
    --include='*/' \
    --include='*.mkv' \
    --exclude='*' \
    source/ target

Опция--archive(-a)заставляет rsyncсохранять метаданные файлов, а также запускает рекурсивное копирование каталогов. Опция --link-destдает rsyncкаталог, из которого существующие файлы могут быть жестко связаны с target. Опции --includeвыбирают каталоги и файлы .mkv, в то время как последняя опция --excludeигнорирует все, что еще не выбрано с помощью --include.

Чтобы удалить пустые каталоги, которые могут быть созданы в target, вы можете использовать findследующим образом:

find target -type d -empty -delete

... если ваш findреализует тест -emptyи действие -delete.

Пример:

source
|-- dir1
|   |-- file1.mkv
|   |-- file1.txt
|   |-- file2.mkv
|   `-- file2.txt
|-- dir2
|   |-- file1.mkv
|   |-- file1.txt
|   |-- file2.mkv
|   `-- file2.txt
|-- dir3
|   |-- file1.mkv
|   |-- file1.txt
|   |-- file2.mkv
|   `-- file2.txt
`-- dir4
    `-- file1.doc

Выполняется команда rsyncвыше, и targetстановится...

target
|-- dir1
|   |-- file1.mkv
|   `-- file2.mkv
|-- dir2
|   |-- file1.mkv
|   `-- file2.mkv
|-- dir3
|   |-- file1.mkv
|   `-- file2.mkv
`-- dir4

Просто показано, что файлы жестко связаны (тот же номер инода, количество ссылок равно 2):

$ ls -l -i source/dir1/file1.mkv target/dir1/file1.mkv
3118217 -rw-r--r--  2 kk  kk  0 Apr 10 17:03 source/dir1/file1.mkv
3118217 -rw-r--r--  2 kk  kk  0 Apr 10 17:03 target/dir1/file1.mkv

Удаление пустых каталогов:

$ find target -type d -empty -delete
$ tree target
target
|-- dir1
|   |-- file1.mkv
|   `-- file2.mkv
|-- dir2
|   |-- file1.mkv
|   `-- file2.mkv
`-- dir3
    |-- file1.mkv
    `-- file2.mkv
0
28.04.2021, 23:18

Я предполагаю, что вы каким-то образом присвоили значения двум переменным dirAиdirB(«Местоположение A» и «второе местоположение» в вашем описании ).

Вы зациклились на всех файлах в dirA.

Каждый раз, когда файл в dirAявляется каталогом, вы создаете другой каталог с тем же именем в dirB. Переключатель --parentпредотвращает появление ошибки mkdir, если новый каталог уже существует, устраняя необходимость проверки существования нового каталога.

Внутренний ifпроверяет наличие файлов.mkv и пропускает каталог, если их нет.

Этот сценарий работает для одного уровня каталога :если у вас есть каталоги внутри каталогов, они не будут просматриваться.

    #! /bin/bash

    dirA=...
    dirB=...

    cd "$dirA"

    for dir in *; do
      if [ -d "$dir" ]; then
         names=$(find "$dir" -maxdepth 1 -name '*.mkv')
         if [ "$names" ]; then
           mkdir --parent "$dirB/$dir"
           ln "$dir"/*.mkv "$dirB/$dir"
         fi
      fi
    done
0
28.04.2021, 23:18

Теги

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