есть ли кто-нибудь, кто может помочь мне отсортировать файлы с помощью сценария bash или команд терминала (или даже небольшой программы Java), которые могут использоваться для сортировки и перемещения файлов в новые папки?
У меня есть папка под названием «веб-страницы» с сотнями html-файлов. Грубо говоря, они разделены на три категории, поэтому мне нужно будет запускать один сценарий три раза с разными переменными или скриптом, который может выполнять всю сортировку и перемещение сразу.
Я хочу найти некоторые строки в файлах, а затем отправить файлы, соответствующие новым папкам. Чтобы упростить, некоторые веб-страницы касаются политики, некоторые - о бизнесе, а некоторые - о компьютерах. Итак, скажем, я хочу искать все файлы в папке «webpages» для слов «выборы», «фондовый рынок» и «с открытым исходным кодом» и перемещать файлы, содержащие слово «выборы», в папку под названием «политика», , файлы, содержащие слово «фондовый рынок», в папку «бизнес» и файлы, содержащие термин «открытый исходный код», в папку «компьютеры».
Как я уже сказал, я попытался понять это, но просто рассмеялся за свои усилия. Я не эксперт. Спасибо!
Я думаю, что некоторая простая магия bash может сделать трюк:
#!/bin/bash
dir1=""
dir2=""
dir3=""
shopt -s nullglob
for i in *.html)
do if [ "$(grep 'keyword1' $i)" != "" ]; then
mv -vf "$i" "$dir1"
elif [ "$(grep 'keyword2' $i)" != "" ]; then
mv -vf "$i" "$dir2"
elif [ "$(grep 'keyword3' $i)" != "" ]; then
mv -vf "$i" "$dir3"
else
echo "$i">>nomatch
fi
done
cat nomatch
Вот несколько способов сделать то, что вы хотите:
find . -iname '*html' -type f -exec grep -q election "{}" \; -and -exec mv {} politics/ \;
Здесь мы используем опцию find -exec:
-exec command ;
Execute command; true if 0 status is returned. All following
arguments to find are taken to be arguments to the command until
an argument consisting of `;' is encountered. The string `{}'
is replaced by the current file name being processed
Итак, первые -exec поисковые запросы файл (здесь, представленный {}) для election, а второй - заготовку. [F11] гарантирует, что второй -exec будет запущен только в том случае, если первый был успешным, если файл соответствует шаблону.
Это тот же базовый подход, что и в ответе Cos64, но с некоторыми улучшениями.
find . -iname '*html' -type f -print0 |
while IFS= read -r -d '' file; do
grep -q election "$file" && mv "$file" politics/
done
Этот сценарий очень похож на тот, что есть в очень хорошем ответе @ WilhelmErasmus с той разницей, что i) он может взять набор шаблонов и замен из командной строки и ii) он также находит файлы в подкаталоги.
#!/usr/bin/env bash
## Exit if no arguments were given
[ -z "$1" ] && echo "At least two arguments are needed." >&2 && exit 1
## Collect the arguments
args=("$@")
## Declare the $dirs associative array
declare -A dirs
## Save the arguments given in the $dirs array.
## $# is the number of arguments given, so this
## will iterate over of them, reading two by two.
for ((i=0;i<$#;i+=2));
do
## The arguments are pairs of patterns and target directories.
## Set the value of this pattern to the value of the next argument,
## its target directory.
dirs[${args[$i]}]="${args[i+1]}"
done
## Ignore globs that match no files
shopt -s nullglob
## This enables ** to match subdirectories
shopt -s globstar
## Find all .html files
for file in **/*{html,htm,HTM,HTML}
do
matched=0;
for pat in "${!dirs[@]}"
do
## Does this file match the pattern?
## The `-q` suppresses grep's output.
grep -q "$pat" "$file" &&
## Set matched to 1 if the file matches.
matched=1 &&
## If the grep succeeded, move the file
## to the corresponding directory
mv "$file" "${dirs[$pat]}" &&
## If the move succeeded, break the loop
## and move to the next pattern.
break
done
## Report files that didn't match
[[ "$matched" -eq 0 ]] && printf "No matches for '%s'\n" "$file" >&2
done
Запустите сценарий, указав ему имена шаблонов и их целей. Например, с вашими вопросами:
bash move_files.sh "election" "politics" "stock market" "business" "open source" "computers"