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-адресами в качестве аргументов.
Используя 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
Я предполагаю, что вы каким-то образом присвоили значения двум переменным 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