Используя sed
:
$ sed -nr 's/^[^\s]+\sname="([^"]+)"\s.*primary-key="([^"]+)">$/\1 \2/p' file.txt
content_analyzer id9
content_analyzer2 id12
content_analyzer_items id56
Используя grep
с PCRE, вы можете получить:
$ grep -Po '(name|primary-key)="\K[^"]+' file.txt
content_analyzer
id9
content_analyzer2
id12
content_analyzer_items
id56
Следующий сценарий будет искать в текущем рабочем каталоге пути вида a/B/B/c
и сжимать их до a/B/c
. Это также сжимает a/B/B/B/B/c
в a/B/c
и a/B/B/c/D/D/e
в a/B/c/D/e
.
Вам потребуется GNU find
для использования опции -regextype
и реализация mv
, поддерживающая -n
. Если у вас их нет, взгляните на небезопасную версию posix в конце скрипта.
shopt -s dotglob failglob
find. -depth -regextype egrep -type d -regex '.*/([^/]*)/\1' -print0 |
while IFS= read -r -d '' path; do
mv -n -t "$path/.." "$path"/* &&
rmdir "$path"
done
Поддерживаются произвольные имена путей, (пробелы, специальные символы, такие как *
, и даже разрывы строк ).
Команда гарантирует, что не перезапишет или удалит какие-либо файлы. В ситуации, как в левом дереве, должен быть сохранен повторяющийся каталог sub-. Вы получите сообщение об ошибке rmdir: failed to remove './A/A'
. Результат виден справа.
. (before) . (after)
└── A └── A
├── someFile ├── someFile
├── collision ├── collision
└── A ├── anotherFile
├── collision └── A
└── anotherFile └── collision
Скрытые файлы также копируются.
Более переносимая версия скрипта, которая не может обрабатывать разрывы строк внутри путей, может перезаписывать файлы в ситуациях, показанных выше, и не может перемещать скрытые файлы. (Поддиректория -сохраняется, если внутри есть скрытые файлы. ).
find. -depth -type d | grep -E -x '.*/([^/]*)/\1' |
while IFS= read -r path; do
mv "$path"/* "$path/.." &&
rmdir "$path"
done
Не уверен, что это то, что тебе нужно, но...
mv /maindir/fold2/ /maindir/renamed/
mv /maindir/renamed/fold2/ /maindir/fold2/
, то переименованный должен быть пустым, удалите его.
или это тоже должно сработать
mv maindir/fold2/fold2/{*,.*} maindir/fold2/
, затем /maindir/fold2/fold2/ должно быть пустым