Переместить все файлы в каталоге в подкаталог

Я не могу найти быстрое решение этой простой проблемы: у меня есть это дерево:

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 требуется здесь!

Это оно! Я использую этот подход довольно часто, поскольку он позволяет исключить не только папку, но и разные папки и файлы одновременно. Если вы хотите исключить, например, sonDirdaughterDir а также nephew.file Вы можете сделать это, просто указав egrep -v '(sonDir|daughterDir|nephew.file)'остальная часть приведенной выше команды остается прежней... и существует множество вариантов!

Это имеет значение? Движение все еще происходит. То, что вы получаете, является скорее предупреждением. Вы можете перенаправить stderr в /dev/null. Кроме того, если это все еще вас беспокоит, используйте команду find, как описано в slhck, или что-то вроде этого:

mv `ls * | grep -v sonDir` sonDir
Другие вопросы по тегам