2

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

fatherDir
   -File1.txt
   -SomeFile.txt
    ...
   - A name.txt
   -sonDir

Я хочу переместить все файлы в папке папка в папке папа / сын.

mv * sonDir

Поскольку sonDir находится в FatherDir, я получаю сообщение об ошибке.

Как этого добиться?

3 ответа3

2

Чтобы найти все файлы в fatherDir вместо использования * (что также дает вам sonDir )

find fatherDir -type f -maxdepth 1 -exec mv {} fatherDir/sonDir \+

{} Будет заменен на каждое найденное имя файла, и все будут перемещены в целевой каталог.

1

Одним из подходов может быть использование 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)' , остальная часть показанной выше команды останется прежней ... и есть много вариаций!

-1

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

mv `ls * | grep -v sonDir` sonDir

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .