Как удалить каталог без удаления его содержимого?

Предположим, что у меня есть каталог /home/smit/test. Внутри у меня есть много подкаталогов и файлов. Я хочу удалить только каталог /home/smit/test, а не его внутренний контент. Таким образом, файлы и подкаталоги /home/smit/test будут автоматически включены в /home/smit/?

Кроме того, в реальном случае у меня есть /usr/share/backgrounds/all/, который имеет много подкаталогов. и эти подкаталоги имеют много изображений. Я хочу удалить все подкаталоги, чтобы их содержимое было включено в /usr/share/backgrounds/all/. Я могу сделать это с помощью графического интерфейса, но я хочу сделать это с помощью удобного терминала. Как я могу это сделать?

7
задан 27 July 2017 в 13:04

11 ответов

В этих ситуациях существует риск перезаписывания файлов с тем же именем. Как упоминалось в @Arronical, вы можете избежать этого, используя флаг -b для mv, который заставляет любые идентично именованные файлы дифференцироваться путем добавления ~ к их именам. Однако, если есть три или более файлов с одним и тем же именем, будут сохранены только первые и последние, поэтому прежде чем переходить к защите ваших файлов, проверьте содержимое.

Первый, простой случай прост; мы можем использовать оболочку glob. Однако это не приведет к перемещению скрытых файлов, поэтому, если у вас есть имена файлов, начинающиеся с ., начните с включения dotglob

shopt -s dotglob

Затем вы можете запустить:

mv -b /home/smit/test/* /home/smit
rmdir /home/smit/test

Если вы хотите, выключите dotglob (он будет возвращаться к стандарту, когда вы откроете новую оболочку):

shopt -u dotglob

Для второго (реального) случая мы будем использовать find, который по умолчанию перемещает скрытые файлы:

Убедитесь, что вы находитесь в правильном месте.

cd /usr/share/background/all
find -type f -exec echo mv -vb -- {} . \;

Если это выглядит хорошо, запустите его без echo, чтобы фактически перейти files

find -type f -exec mv -vb -- {} . \;

Затем найдите каталоги

find -type d

Если вы видите, что вы хотите удалить:

find -type d -delete

Это безопасно, так как это будет отказаться от удаления каталогов, которые все еще имеют содержимое.

16
ответ дан 22 May 2018 в 20:07
  • 1
    Вы также можете использовать опции -b или --backup для mv, чтобы справиться с повторяющимися именами файлов, и сделать резервные копии исходных версий. – Arronical 27 July 2017 в 12:44
  • 2
    @Arronical большое спасибо: D отредактирован – Zanna 27 July 2017 в 12:50
  • 3
    Спасибо. Теперь я более крутой. Но мне все еще нужно взглянуть на страницу man find, чтобы стать более круче:) – SmitTheLastFirefoxUser 27 July 2017 в 12:59
  • 4
    @SMITPATIL каталоги должны быть опустошены операцией перемещения. Я предполагаю, что вам действительно нужно запустить find -type f -exec sudo mv -vb -- {} . \; (поскольку mv действия - это операции записи), но если нет, были ли ошибки разрешения? Хотели бы вы начать чат, чтобы выяснить, что происходит? – Zanna 27 July 2017 в 13:10
  • 5
    В этом случае это будет find SOURCE -type f -exec mv -bt TARGET -- {} + && rm -rf SOURCE. – David Foerster 27 July 2017 в 19:14

В этих ситуациях существует риск перезаписывания файлов с тем же именем. Как упоминалось в @Arronical, вы можете избежать этого, используя флаг -b для mv, который заставляет любые идентично именованные файлы дифференцироваться путем добавления ~ к их именам. Однако, если есть три или более файлов с одним и тем же именем, будут сохранены только первые и последние, поэтому прежде чем переходить к защите ваших файлов, проверьте содержимое.

Первый, простой случай прост; мы можем использовать оболочку glob. Однако это не приведет к перемещению скрытых файлов, поэтому, если у вас есть имена файлов, начинающиеся с ., начните с включения dotglob

shopt -s dotglob

Затем вы можете запустить:

mv -b /home/smit/test/* /home/smit rmdir /home/smit/test

Если вы хотите, выключите dotglob (он будет возвращаться к стандарту, когда вы откроете новую оболочку):

shopt -u dotglob

Для второго (реального) случая мы будем использовать find, который по умолчанию перемещает скрытые файлы:

Убедитесь, что вы находитесь в правильном месте.

cd /usr/share/background/all find -type f -exec echo mv -vb -- {} . \;

Если это выглядит хорошо, запустите его без echo, чтобы фактически перейти files

find -type f -exec mv -vb -- {} . \;

Затем найдите каталоги

find -type d

Если вы видите, что вы хотите удалить:

find -type d -delete

Это безопасно, так как это будет отказаться от удаления каталогов, которые все еще имеют содержимое.

16
ответ дан 18 July 2018 в 09:34

В этих ситуациях существует риск перезаписывания файлов с тем же именем. Как упоминалось в @Arronical, вы можете избежать этого, используя флаг -b для mv, который заставляет любые идентично именованные файлы дифференцироваться путем добавления ~ к их именам. Однако, если есть три или более файлов с одним и тем же именем, будут сохранены только первые и последние, поэтому прежде чем переходить к защите ваших файлов, проверьте содержимое.

Первый, простой случай прост; мы можем использовать оболочку glob. Однако это не приведет к перемещению скрытых файлов, поэтому, если у вас есть имена файлов, начинающиеся с ., начните с включения dotglob

shopt -s dotglob

Затем вы можете запустить:

mv -b /home/smit/test/* /home/smit rmdir /home/smit/test

Если вы хотите, выключите dotglob (он будет возвращаться к стандарту, когда вы откроете новую оболочку):

shopt -u dotglob

Для второго (реального) случая мы будем использовать find, который по умолчанию перемещает скрытые файлы:

Убедитесь, что вы находитесь в правильном месте.

cd /usr/share/background/all find -type f -exec echo mv -vb -- {} . \;

Если это выглядит хорошо, запустите его без echo, чтобы фактически перейти files

find -type f -exec mv -vb -- {} . \;

Затем найдите каталоги

find -type d

Если вы видите, что вы хотите удалить:

find -type d -delete

Это безопасно, так как это будет отказаться от удаления каталогов, которые все еще имеют содержимое.

16
ответ дан 24 July 2018 в 19:22

В этих ситуациях существует риск перезаписывания файлов с тем же именем. Как упоминалось в @Arronical, вы можете избежать этого, используя флаг -b для mv, который заставляет любые идентично именованные файлы дифференцироваться путем добавления ~ к их именам. Однако, если есть три или более файлов с тем же именем, будут сохранены только первые и последние, поэтому прежде чем переходить на защиту ваших файлов, проверьте содержимое.

Первый простой случай - это просто; мы можем использовать оболочку glob. Однако это не приведет к перемещению скрытых файлов, поэтому, если у вас есть имена файлов, начинающиеся с ., начните с включения dotglob

shopt -s dotglob

Затем вы можете запустить:

mv -b /home/smit/test/* /home/smit
rmdir /home/smit/test

Если хотите, выключите dotglob (он будет возвращаться к умолчанию по умолчанию, когда вы откроете новую оболочку):

shopt -u dotglob

Для второго (реального) случая мы будем использовать find, который по умолчанию перемещает скрытые файлы:

Убедитесь, что вы находитесь в правильном месте.

cd /usr/share/background/all
find -type f -exec echo mv -vb -- {} . \;

Если это выглядит хорошо, запустите его без echo, чтобы фактически перейти files

find -type f -exec mv -vb -- {} . \;

Затем найдите каталоги

find -type d

Если вы видите, что вы хотите удалить:

find -type d -delete

Это безопасно, так как это будет отказаться от удаления каталогов, которые все еще имеют содержимое.

16
ответ дан 31 July 2018 в 11:11

В этих ситуациях существует риск перезаписывания файлов с тем же именем. Как упоминалось в @Arronical, вы можете избежать этого, используя флаг -b для mv, который заставляет любые идентично именованные файлы дифференцироваться путем добавления ~ к их именам. Однако, если есть три или более файлов с тем же именем, будут сохранены только первые и последние, поэтому прежде чем переходить на защиту ваших файлов, проверьте содержимое.

Первый простой случай - это просто; мы можем использовать оболочку glob. Однако это не приведет к перемещению скрытых файлов, поэтому, если у вас есть имена файлов, начинающиеся с ., начните с включения dotglob

shopt -s dotglob

Затем вы можете запустить:

mv -b /home/smit/test/* /home/smit
rmdir /home/smit/test

Если хотите, выключите dotglob (он будет возвращаться к умолчанию по умолчанию, когда вы откроете новую оболочку):

shopt -u dotglob

Для второго (реального) случая мы будем использовать find, который по умолчанию перемещает скрытые файлы:

Убедитесь, что вы находитесь в правильном месте.

cd /usr/share/background/all
find -type f -exec echo mv -vb -- {} . \;

Если это выглядит хорошо, запустите его без echo, чтобы фактически перейти files

find -type f -exec mv -vb -- {} . \;

Затем найдите каталоги

find -type d

Если вы видите, что вы хотите удалить:

find -type d -delete

Это безопасно, так как это будет отказаться от удаления каталогов, которые все еще имеют содержимое.

16
ответ дан 31 July 2018 в 22:26

В этих ситуациях существует риск перезаписывания файлов с тем же именем. Как упоминалось в @Arronical, вы можете избежать этого, используя флаг -b для mv, который заставляет любые идентично именованные файлы дифференцироваться путем добавления ~ к их именам. Однако, если есть три или более файлов с тем же именем, будут сохранены только первые и последние, поэтому прежде чем переходить на защиту ваших файлов, проверьте содержимое.

Первый простой случай - это просто; мы можем использовать оболочку glob. Однако это не приведет к перемещению скрытых файлов, поэтому, если у вас есть имена файлов, начинающиеся с ., начните с включения dotglob

shopt -s dotglob

Затем вы можете запустить:

mv -b /home/smit/test/* /home/smit
rmdir /home/smit/test

Если хотите, выключите dotglob (он будет возвращаться к умолчанию по умолчанию, когда вы откроете новую оболочку):

shopt -u dotglob

Для второго (реального) случая мы будем использовать find, который по умолчанию перемещает скрытые файлы:

Убедитесь, что вы находитесь в правильном месте.

cd /usr/share/background/all
find -type f -exec echo mv -vb -- {} . \;

Если это выглядит хорошо, запустите его без echo, чтобы фактически перейти files

find -type f -exec mv -vb -- {} . \;

Затем найдите каталоги

find -type d

Если вы видите, что вы хотите удалить:

find -type d -delete

Это безопасно, так как это будет отказаться от удаления каталогов, которые все еще имеют содержимое.

16
ответ дан 2 August 2018 в 17:10

В этих ситуациях существует риск перезаписывания файлов с тем же именем. Как упоминалось в @Arronical, вы можете избежать этого, используя флаг -b для mv, который заставляет любые идентично именованные файлы дифференцироваться путем добавления ~ к их именам. Однако, если есть три или более файлов с тем же именем, будут сохранены только первые и последние, поэтому прежде чем переходить на защиту ваших файлов, проверьте содержимое.

Первый простой случай - это просто; мы можем использовать оболочку glob. Однако это не приведет к перемещению скрытых файлов, поэтому, если у вас есть имена файлов, начинающиеся с ., начните с включения dotglob

shopt -s dotglob

Затем вы можете запустить:

mv -b /home/smit/test/* /home/smit
rmdir /home/smit/test

Если хотите, выключите dotglob (он будет возвращаться к умолчанию по умолчанию, когда вы откроете новую оболочку):

shopt -u dotglob

Для второго (реального) случая мы будем использовать find, который по умолчанию перемещает скрытые файлы:

Убедитесь, что вы находитесь в правильном месте.

cd /usr/share/background/all
find -type f -exec echo mv -vb -- {} . \;

Если это выглядит хорошо, запустите его без echo, чтобы фактически перейти files

find -type f -exec mv -vb -- {} . \;

Затем найдите каталоги

find -type d

Если вы видите, что вы хотите удалить:

find -type d -delete

Это безопасно, так как это будет отказаться от удаления каталогов, которые все еще имеют содержимое.

16
ответ дан 3 August 2018 в 19:44

В этих ситуациях существует риск перезаписывания файлов с тем же именем. Как упоминалось в @Arronical, вы можете избежать этого, используя флаг -b для mv, который заставляет любые идентично именованные файлы дифференцироваться путем добавления ~ к их именам. Однако, если есть три или более файлов с тем же именем, будут сохранены только первые и последние, поэтому прежде чем переходить на защиту ваших файлов, проверьте содержимое.

Первый простой случай - это просто; мы можем использовать оболочку glob. Однако это не приведет к перемещению скрытых файлов, поэтому, если у вас есть имена файлов, начинающиеся с ., начните с включения dotglob

shopt -s dotglob

Затем вы можете запустить:

mv -b /home/smit/test/* /home/smit
rmdir /home/smit/test

Если хотите, выключите dotglob (он будет возвращаться к умолчанию по умолчанию, когда вы откроете новую оболочку):

shopt -u dotglob

Для второго (реального) случая мы будем использовать find, который по умолчанию перемещает скрытые файлы:

Убедитесь, что вы находитесь в правильном месте.

cd /usr/share/background/all
find -type f -exec echo mv -vb -- {} . \;

Если это выглядит хорошо, запустите его без echo, чтобы фактически перейти files

find -type f -exec mv -vb -- {} . \;

Затем найдите каталоги

find -type d

Если вы видите, что вы хотите удалить:

find -type d -delete

Это безопасно, так как это будет отказаться от удаления каталогов, которые все еще имеют содержимое.

16
ответ дан 5 August 2018 в 04:29

В этих ситуациях существует риск перезаписывания файлов с тем же именем. Как упоминалось в @Arronical, вы можете избежать этого, используя флаг -b для mv, который заставляет любые идентично именованные файлы дифференцироваться путем добавления ~ к их именам. Однако, если есть три или более файлов с тем же именем, будут сохранены только первые и последние, поэтому прежде чем переходить на защиту ваших файлов, проверьте содержимое.

Первый простой случай - это просто; мы можем использовать оболочку glob. Однако это не приведет к перемещению скрытых файлов, поэтому, если у вас есть имена файлов, начинающиеся с ., начните с включения dotglob

shopt -s dotglob

Затем вы можете запустить:

mv -b /home/smit/test/* /home/smit
rmdir /home/smit/test

Если хотите, выключите dotglob (он будет возвращаться к умолчанию по умолчанию, когда вы откроете новую оболочку):

shopt -u dotglob

Для второго (реального) случая мы будем использовать find, который по умолчанию перемещает скрытые файлы:

Убедитесь, что вы находитесь в правильном месте.

cd /usr/share/background/all
find -type f -exec echo mv -vb -- {} . \;

Если это выглядит хорошо, запустите его без echo, чтобы фактически перейти files

find -type f -exec mv -vb -- {} . \;

Затем найдите каталоги

find -type d

Если вы видите, что вы хотите удалить:

find -type d -delete

Это безопасно, так как это будет отказаться от удаления каталогов, которые все еще имеют содержимое.

16
ответ дан 6 August 2018 в 21:33

В этих ситуациях существует риск перезаписывания файлов с тем же именем. Как упоминалось в @Arronical, вы можете избежать этого, используя флаг -b для mv, который заставляет любые идентично именованные файлы дифференцироваться путем добавления ~ к их именам. Однако, если есть три или более файлов с тем же именем, будут сохранены только первые и последние, поэтому прежде чем переходить на защиту ваших файлов, проверьте содержимое.

Первый простой случай - это просто; мы можем использовать оболочку glob. Однако это не приведет к перемещению скрытых файлов, поэтому, если у вас есть имена файлов, начинающиеся с ., начните с включения dotglob

shopt -s dotglob

Затем вы можете запустить:

mv -b /home/smit/test/* /home/smit
rmdir /home/smit/test

Если хотите, выключите dotglob (он будет возвращаться к умолчанию по умолчанию, когда вы откроете новую оболочку):

shopt -u dotglob

Для второго (реального) случая мы будем использовать find, который по умолчанию перемещает скрытые файлы:

Убедитесь, что вы находитесь в правильном месте.

cd /usr/share/background/all
find -type f -exec echo mv -vb -- {} . \;

Если это выглядит хорошо, запустите его без echo, чтобы фактически перейти files

find -type f -exec mv -vb -- {} . \;

Затем найдите каталоги

find -type d

Если вы видите, что вы хотите удалить:

find -type d -delete

Это безопасно, так как это будет отказаться от удаления каталогов, которые все еще имеют содержимое.

16
ответ дан 9 August 2018 в 01:59

В этих ситуациях существует риск перезаписывания файлов с тем же именем. Как упоминалось в @Arronical, вы можете избежать этого, используя флаг -b для mv, который заставляет любые идентично именованные файлы дифференцироваться путем добавления ~ к их именам. Однако, если есть три или более файлов с тем же именем, будут сохранены только первые и последние, поэтому прежде чем переходить на защиту ваших файлов, проверьте содержимое.

Первый простой случай - это просто; мы можем использовать оболочку glob. Однако это не приведет к перемещению скрытых файлов, поэтому, если у вас есть имена файлов, начинающиеся с ., начните с включения dotglob

shopt -s dotglob

Затем вы можете запустить:

mv -b /home/smit/test/* /home/smit
rmdir /home/smit/test

Если хотите, выключите dotglob (он будет возвращаться к умолчанию по умолчанию, когда вы откроете новую оболочку):

shopt -u dotglob

Для второго (реального) случая мы будем использовать find, который по умолчанию перемещает скрытые файлы:

Убедитесь, что вы находитесь в правильном месте.

cd /usr/share/background/all
find -type f -exec echo mv -vb -- {} . \;

Если это выглядит хорошо, запустите его без echo, чтобы фактически перейти files

find -type f -exec mv -vb -- {} . \;

Затем найдите каталоги

find -type d

Если вы видите, что вы хотите удалить:

find -type d -delete

Это безопасно, так как это будет отказаться от удаления каталогов, которые все еще имеют содержимое.

16
ответ дан 14 August 2018 в 20:11
  • 1
    Вы также можете использовать опции -b или --backup для mv, чтобы справиться с повторяющимися именами файлов, и сделать резервные копии исходных версий. – Arronical 27 July 2017 в 12:44
  • 2
    @Arronical большое спасибо: D отредактирован – Zanna 27 July 2017 в 12:50
  • 3
    Спасибо. Теперь я более крутой. Но мне все еще нужно взглянуть на страницу man find, чтобы стать более круче:) – noone 27 July 2017 в 12:59
  • 4
  • 5
    @SMITPATIL каталоги должны быть опустошены операцией перемещения. Я предполагаю, что вам действительно нужно запустить find -type f -exec sudo mv -vb -- {} . \; (поскольку mv действия - это операции записи), но если нет, были ли ошибки разрешения? Хотели бы вы начать чат, чтобы выяснить, что происходит? – Zanna 27 July 2017 в 13:10
  • 6
    В этом случае это будет find SOURCE -type f -exec mv -bt TARGET -- {} + && rm -rf SOURCE. – David Foerster 27 July 2017 в 19:14

Другие вопросы по тегам:

Похожие вопросы: