Как переместить все родственные папки в одну папку?
Я извиняюсь, что это кажется таким глупым вопросом, но я не могу позволить себе все испортить.
У меня есть несколько папок, таких как:
/ Пользователей / меня / Foo / oops1
/ Пользователей / меня / Foo / oops2
/ Пользователей / меня / Foo / oops3
/ Пользователей / меня / Foo / oops4
/ Пользователей / меня / Foo / бар
К сожалению, они не имеют одинакового названия, и существуют сотни папок с сообщениями.
Я намеревался скопировать все папки oops в панель. Есть ли простой способ переместить все папки oops в панель, которые не приведут к какой-либо проблеме рекурсивного перемещения?
Копирование файлов заняло несколько часов. Я надеюсь, что движение будет намного быстрее.
Это на сервере RedHat Linux, кстати. У меня есть только доступ по SSH.
Я думаю, что если я сделаю
cd foo
mv * bar
будет проблема.
5 ответов
К сожалению, как ответ Мэтта, так и ответ Николь демонстрируют плохой стиль и сломаются, если какая-либо из папок даже содержит один символ пробела, символ выделения (например, *
) или перевод строки. Бегfor item in $(ls …)
Это огромная ошибка, которую можно совершить, потому что она рано или поздно укусит их, а перебор имен файлов, неправильный вывод их может вызвать всевозможные проблемы.
Никогда не анализируйте выводls
,
В Linux есть инструмент для поиска файлов, соответствующих определенным критериям, и он называется find
:
find . -mindepth 1 -maxdepth 1 \
-type d ! -regex ".\/bar$" \
-exec mv '{}' ./bar/ \;
Это переместит любые каталоги в текущем рабочем каталоге, которые не называются bar
в ./bar/
, Это будет работать, даже если имена каталогов содержат пробелы, символы-заглушки или символы новой строки.
Регулярное выражение .\/bar$
будет соответствовать только каталог с именем ./bar
и это отрицается !
,
То, что вы предлагаете, совершенно верно. mv
достаточно умен и скажет так:
mv: cannot move `bar' to a subdirectory of itself, `bar/bar'
Тем не менее, все ваши oopsx dirs будут внутри бара.
Да, вы правы, это было бы проблемой, потому что *
также будет соответствовать bar
; ты не можешь mv
каталог в себя.
Действенный способ состоит в том, чтобы использовать подстановку команд и цикл для mv
только то, что не bar
, Например, в bash
Вы можете написать что-то вроде этого, но обратите внимание, что произойдет сбой, если он попадет в имя, которое содержит пробел (потому что подстановка команд разбивает вещи на слова в пробелах.)
mv $(for i in *; do if [ $i != "bar" ]; then echo $i; fi; done) bar
Но, честно говоря, я ленивый. я мог бы mv
бар с пути, то mv
все в это, затем переместите его обратно. Вы перемещаете только ссылки на файловую систему, а не содержимое файла, так что это быстро. Это также имеет преимущество работы, если у вас есть имена с пробелами.
cd foo
mv bar ../bar.save
mv * ../bar.save
mv ../bar.save bar
Если, если вы чувствуете себя в большей безопасности, вы можете сделать это в BASH:
for item in `ls -d | grep -v "^bar$"`; do mv $item bar; done;
CD в Foo
mv -t bar oops[[:digit:]]
из более общего
mv -t bar oops*