Я нахожусь по пути:
/myuser/downloads/
И я создаю подпапку:
/myuser/downloads/new
Теперь я хочу переместить все файлы и папки / подпапки в загрузках папку в подпапку.
Как я могу это сделать?
Я пытался:
mv -R *.* new/
Но движение, похоже, не требует переключателя -R.
Команда
mv !(new) new
должна добиться цели. Если это не работает, сначала запустите shopt -s extglob
.
Чтобы также переместить скрытые файлы / каталоги (начинающиеся с точки), сначала запустите также shopt -s dotglob
.
Итак, подведем итог:
shopt -s extglob dotglob
mv !(new) new
shopt -u dotglob
(всегда лучше сбросить dotglob
, чтобы избежать неприятных сюрпризов).
Я нашел что-то вроде этого, но немного проще для понимания, и это может хорошо сработать и для вас:
ls | grep -v new | xargs mv -t new
Добавление объяснения к вышеуказанному решению:
От человека страницы:
mv -t
-t, --target-directory=DIRECTORY
move all SOURCE arguments into DIRECTORY
grep -v
-v, --invert-match
Invert the sense of matching, to select non-matching lines.
Объясняется пошагово:
ls
перечислит файлы в текущем каталоге grep -v new
вернет канал, который не соответствует новому xargs mv -t new
переместит переданные ему файлы из grep -v
в целевой каталог Простая идея. Предполагая, что вы находитесь в / myuser , переименуйте загрузок в новый , создайте новый каталог загрузок , затем переместите новый в него.
mv downloads new # downloads is now called new
mkdir downloads # create new directory downloads
mv new downloads # move new into it.
Вы можете попробовать этот альтернативный процесс - остаться в пути
/myuser/downloads/
, но вместо того, чтобы сначала создать каталог /myuser/downloads/new/
, вместо этого создайте папку в каталоге /myuser/
с помощью команды mkdir ../new
, затем переместите все файлы из downloads
в new
и, наконец, переместите new
в downloads
. Вы можете сделать это в одной строке, находясь в пути /myuser/downloads/
, с помощью команды:
mkdir ../new && mv * ../new && mv ../new ../downloads
В этом случае вам не нужно беспокоиться о какой-либо «фильтрации» файлов / папок, поскольку new
находится на том же уровне пути, что и downloads
, так что вы можете просто переместить все из downloads
в new
, а затем переместить new
в загрузку`.
Однако, если вы уже создали подпапку new
и не хотите создавать другую, не беспокойтесь - просто измените команду mkdir
в левой части первой &&
в команда, показанная выше для команды mv
, толкающая new
вверх по пути; другими словами, пока вы все еще находитесь в /myuser/downloads/
, вы можете изменить mkdir ../new
на mv new ..
. Затем подпапка new
[в пути /myuser/downloads/new/
] перемещается до /myuser/new/
на том же уровне, что и /myuser/downloads/
, и затем вы можете выполнить остальную часть команды, как показано выше. Все вместе мы имеем, начиная с пути /myuser/downloads/
:
mv new .. && mv * ../new && mv ../new ../downloads
и, поскольку вы хотели «переместить все файлы и папки / подпапки в папке загрузок в подпапку [[ 1129]] ", все готово! Если бы вы хотели переместить только файлы (или только папки или [вставить более детальное перемещение объекта]), то вам пришлось бы использовать другие команды, которые могут «фильтровать» объекты, такие как grep
. Приведенные выше команды достаточны для ваших целей.
Если вы хотите переместить все файлы из папки в одну из ее подпапок, вы можете использовать следующую команду:
find /myuser/downloads/ -type d -name 'new' -prune -type f | xargs mv -t /myuser/downloads/new
Он найдет все файлы и затем переместит их в вашу подпапку. [ 114]
@waltinator: добавлено -type d -name 'new' -prune
для предотвращения обхода /myuser/downloads/new
.
mv * subdir1
и игнорируйте предупреждение. Вы можете просто использовать mv * subdir1
. Вы увидите предупреждающее сообщение, касающееся попытки переместить subdir1
в себя, например:
mv: cannot move 'subdir1' to a subdirectory of itself, 'subdir1/subdir1'
Но все остальные файлы и каталоги будут перемещены в subdir1
правильно.
Пример:
$ ls
$ mkdir dir1 dir2 dir3
$ touch file1.txt file2.txt file3.txt
$ mkdir subdir1
$ ls
#=> dir1 dir2 dir3 file1.txt file2.txt file3.txt subdir1
$ mv * subdir1
#=> mv: cannot move 'subdir1' to a subdirectory of itself, 'subdir1/subdir1'
$ ls
#=> subdir1
$ ls subdir1
#=> dir1 dir2 dir3 file1.txt file2.txt file3.txt