Использование XMLStarlet(иногда устанавливается как xmlstarlet
, а неxml
):
paths=( $( xml sel -t -v '//FileSetFolder/Path' file.xml ) )
for path in "${paths[@]}"; do
filetypes=( $( xml sel -t -v "//FileSetFolder[Path=\"$path\"]/FileType" file.xml ) )
for filetype in "${filetypes[@]}"; do
printf 'Path "%s" has a filetype "%s"\n' "$path" "$filetype"
done
done
Выход:
Path "D:\apache-2.4.10\htdocs" has a filetype "rep"
Path "D:\apache-2.4.10\htdocs" has a filetype "zip"
Path "D:\apache-2.4.10\htdocs" has a filetype "mnt"
Path "D:\Download\ROSXcenterAutoArchive\ArchiveStorage\archive" has a filetype "mnt"
Path "D:\Download\ROSXcenterAutoArchive\ArchiveStorage\archive" has a filetype "952230"
У меня есть для вас 3 варианта, Основные идеи:
grep | xargs mv
grep | parallel mv
find -exec grep -q -exec mv
grep | xargs mv
Используйте grep
и xargs
:
grep -FlZ "some string" *.txt \
| xargs -0 -I{} sh -c 'echo mv "$1" "${1%.*}.pdf" some/other/directory' xargs-sh {}
grep
:
-F
соответствует полной строке, а не шаблону -l
выводить только совпадающие имена файлов -Z
нулевой вывод -разделитель между именами файлов (Это важно, потому что имена файлов могут иметь символы новой строки, поэтому вы не можете полагаться на новую строку в качестве разделителя)xargs
:
-0
считывает ноль -данные с разделителями grep | parallel mv
С помощью xargs
вам нужно вызвать подоболочку, используя sh -c
, чтобы иметь возможность получить соответствующее имя файла PDF.
Вместо этого вы также можете использовать GNU parallel
классные функции !!
grep -FlZ "some string" *.txt \
| parallel -0 -j1 echo mv {} {.}.pdf some/other/directory
-j1
только одно задание за раз {}
имя файла {.}
имя файла без расширения find -exec grep -q -exec mv
И еще один вариант, использующийfind
:
find. -maxdepth 1 -name "*.txt" \
-exec grep -Fq "some string" {} \; \
-exec sh -c 'echo mv "$1" "${1%.*}.pdf" some/other/location' find-sh {} \;
-maxdepth 1
чтобы не повторять grep -q
, чтобы просто получить код ошибки вместо имен файлов, второй -exec
запустится только после успешного завершения первого. -exec
в основном аналогичен xargs
в первом варианте. find
позаботится об этом. Для каждого параметра удалите echo
, если результат вас устраивает.
Если у вас нет команды parallel
, сделайте с двумя xargs
, как показано ниже
grep -l 'search string' *.txt | xargs -I {} basename {}.txt | xargs -I {} cp {}.pdf /destination-directory