У меня есть файл, который содержит ссылки загрузки как это:
Google.com/image2
Google.com/image3
Google.com/image4
Google.com/image5
Google.com/image6
Я хочу загрузить всех их использующих сценарий. Если имя запускает с' загрузки этот файл к s
каталог, если это - b, затем перемещает его в b
каталог...
Загрузите все файлы, затем переместите их использующий шарики оболочки:
#!/bin/bash
wget -i /path/to/download_list
mv s* ./s/
mv b* ./b/
-i
: Считайте URL из локального или внешнего файла.Вы могли бы получить предупреждение:
mv: cannot move 's' to a subdirectory of itself.
Это прекрасно, можно проигнорировать его, или использование find
вместо этого:
#!/bin/bash
wget -i /path/to/download_list
find -maxdepth 1 -iname "s*" -type f -exec mv "{}" ./s \;
find -maxdepth 1 -iname "b*" -type f -exec mv "{}" ./b \;
И с a for
цикл, в котором можно работать на всех алфавитах, название сценария, script.sh
:
#!/bin/bash
wget -i /path/to/download_list
mkdir -p {a..z}
for l in {a..z};
do
find -maxdepth 1 -type f -iname "${l}*" -not -iname script.sh -exec mv "{}" "./${l}" \;
done
Дополнение к хорошему ответу @Ravexina.
Решение без цикла:
wget -i /path/to/download_list
mkdir -p {a..z}
# mv the files with rename tool
rename 's/^((.).+)$/$2\/$1/' *
# clean up empty directories
find . -maxdepth 1 -name '[a-z]' -type d -empty -delete
Решение загрузить непосредственно в желаемую папку:
# expand file to list and iterate
for path in $(<"/path/to/download_list"); do
# get file part of path
name=$(basename "$path")
# use first character of name as dir
dir=${name:0:1}
# create dir is not exist
mkdir -p "$dir"
# download path directly to dir
wget "$path" -P "$dir"
done