У меня есть структура каталогов:
~/MYDIR/
/DESTINATIONDIR/
/DIR1/
/DIR2/
/file1
/file2
Я должен переместиться DIR1, DIR2,file1,file2
кому: DESTINATIONDIR
Что самый изящный и оптимальный путь состоит в том, чтобы сделать это от терминала?
UPD: предположите, что у нас есть намного больше файлов и директоров с различными именами
Существует три способа, которыми я рассмотрел бы выполнение этого.
mv ~/MYDIR/* ~/MYDIR/DESTINATIONDIR
, Это попытается переместить место назначения в себя и взорвется:
mv: cannot move ‘~/MYDIR/DESTINATIONDIR’ to a subdirectory of itself, ‘~/MYDIR/DESTINATIONDIR/DESTINATIONDIR’
, Но это переместит (почти) все остальное. Таким образом, это работает, но это - определенная путаница. Если необходимо соответствовать скрытым файлам, работать shopt -s dotglob
заранее, и это будет работать.
, Учитывая короткий список вещей, мы можем довольно легко просто перечислить их с небольшим расширением удара:
mv ~/MYDIR/{DIR{1,2},file{1,2}} ~/MYDIR/DESTINATIONDIR
при необходимости в скрытых файлах с этим методом, просто включайте их в список.
, Если этот список прибывает из чего-то еще (например, find
) может быть трудно гарантировать, что место назначения является последним аргументом. Можно переместить место назначения в переднюю сторону с -t
аргумент. Это - ужасный пример, но выделяется при необходимости в нем:
find ~/MYDIR/ -maxdepth 1 ! -name DESTINATIONDIR -exec mv -t ~/MYDIR/DESTINATIONDIR {} +
shopt
, элегантность определяется. Так позволяют нам подвести баланс между ручным списком и подстановочными знаками. Путем включения расширенных globbing функций в Bash мы можем выбрать (почти) все , но целевой каталог.
shopt -s extglob
mv ~/MYDIR/!(DESTINATIONDIR) ~/MYDIR/DESTINATIONDIR
, Если необходимо соответствовать скрытым файлам, работайте shopt -s dotglob
заранее, и это будет работать.
что относительно:
cd ~/MYDIR
mv DIR* file* DESTINATIONDIR