Переместить все файлы в каталоге в подкаталог
Я не могу найти быстрое решение этой простой проблемы: у меня есть это дерево:
fatherDir
-File1.txt
-SomeFile.txt
...
- A name.txt
-sonDir
Я хочу переместить все файлы в папке FatherDir в папке FatherDir/SonDir.
mv * sonDir
Поскольку sonDir находится в FatherDir, я получаю сообщение об ошибке.
Как этого добиться?
3 ответа
Чтобы найти все файлы в fatherDir
вместо того, чтобы использовать *
(который дает вам sonDir
тоже)
find fatherDir -type f -maxdepth 1 -exec mv {} fatherDir/sonDir \+
{}
будет заменено на каждое найденное имя файла, и все будет перемещено в целевой каталог.
Одним из подходов может быть использование grep в сочетании с xargs:
ls -A | egrep -v sonDir | xargs -i mv {} sonDir
- сначала перечислите все файлы и папки в текущем каталоге (например, FatherDir) с
ls
- убедитесь, что вы прочитали скрытые файлы, а также
-A
флаг egrep -v
позволяет исключить sonDir из печатного вывода- создать командную строку из стандартного ввода с
xargs
и заменить{}
с учетом имени файла. вариант-i
требуется здесь!
Это оно! Я использую этот подход довольно часто, поскольку он позволяет исключить не только папку, но и разные папки и файлы одновременно. Если вы хотите исключить, например, sonDir
daughterDir
а также nephew.file
Вы можете сделать это, просто указав egrep -v '(sonDir|daughterDir|nephew.file)'
остальная часть приведенной выше команды остается прежней... и существует множество вариантов!
Это имеет значение? Движение все еще происходит. То, что вы получаете, является скорее предупреждением. Вы можете перенаправить stderr в /dev/null. Кроме того, если это все еще вас беспокоит, используйте команду find, как описано в slhck, или что-то вроде этого:
mv `ls * | grep -v sonDir` sonDir