Как переместить какую-то конкретную папку, сохранив предопределенную структуру каталогов?

Используя 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
0
10.05.2019, 07:37
2 ответа

Следующий сценарий будет искать в текущем рабочем каталоге пути вида 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

Скрытые файлы также копируются.

Плохая версия Posix

Более переносимая версия скрипта, которая не может обрабатывать разрывы строк внутри путей, может перезаписывать файлы в ситуациях, показанных выше, и не может перемещать скрытые файлы. (Поддиректория -сохраняется, если внутри есть скрытые файлы. ).

find. -depth -type d | grep -E -x '.*/([^/]*)/\1' |
while IFS= read -r path; do
  mv "$path"/* "$path/.." &&
  rmdir "$path"
done
1
28.01.2020, 02:30

Не уверен, что это то, что тебе нужно, но...

mv /maindir/fold2/ /maindir/renamed/
mv /maindir/renamed/fold2/ /maindir/fold2/

, то переименованный должен быть пустым, удалите его.

или это тоже должно сработать

mv maindir/fold2/fold2/{*,.*} maindir/fold2/

, затем /maindir/fold2/fold2/ должно быть пустым

1
28.01.2020, 02:30

Теги

Похожие вопросы