Я новичок, и мне нужна помощь.
Я пытаюсь создать сценарий для перемещения некоторых файлов из одного каталога в другой каталог. Прежде чем создавать сценарий, который я тестировал команда и она работала:
mv/path/to/source/path/to/destination
After I ‘ мы создали сценарий с помощью nano
:
#! bin/bash/echo "mv/path/to/source/path/to/ destination "
Я сделал исполняемый файл скрипта с помощью: chmod + x file
, а затем выполнял его как ./file
, но появляется следующая ошибка:
bash: ./move.sh:/bin/bash/: плохой интерпретатор: не каталог
Я пробовал использовать sudo ./file
и файл bash, но он не работает.
Я использую Ubuntu, установленную с VirtualBox.
Это потому, что вы использовали #! bin/bash/
, и это неправильный. Правильный способ:
#!/Bin/bash
Это называется shebang, и он сообщает оболочке, какая программа интерпретировать сценарий при его выполнении.
Еще один момент: абсолютный путь для интерпретатора bash в Ubuntu — /bin/bash
, а не bin/bash/
или что-то другое. Вы можете проверить это с помощью команды which bash
.
И еще кое-что, но, вероятно, вы это знаете: следующая строка:
echo "mv/path/to/source/path/to/destination"
отобразит только текстовое сообщение с mv/path/ к/источнику/пути/к/назначению
. Чтобы действительно переместить файлы, используйте следующий сценарий:
#!/Bin/bashmv/path/to/source/path/to/destination
Вот так должен выглядеть ваш скрипт.
1
Как перезаписать целевые файлы с помощью mv?
У меня есть тонна файлов и каталогов в подкаталоге, который я хочу переместить в родительский каталог. В целевом каталоге уже есть файлы и каталоги, которые нужно перезаписать. Файлы, которые есть только в целевом объекте, следует оставить нетронутыми. Могу ли я заставить mv
сделать это? Он ( mv * ..
) жалуется
mv: не может переместить `xyz 'в` ../xyz': каталог не пуст
Что мне не хватает?
Вам нужно будет скопировать их в место назначения, а затем удалить источник, используя команды cp -r * ..
, за которым следует rm -rf *
.
Я не думаю, что вы можете «объединить» каталоги с использованием mv
.
rsync
Наверное, здесь был бы лучший вариант. Это так же просто, как rsync -a subdir/./
.
Мое тестовое дерево в filename
: формат содержимого
:
./file1: root./file2: root./dir/file3: dir./dir/file4: dir./subdir/dir /file3: subdir./subdir/file1: subdir
Запуск rsync
:
$ rsync -a - v subdir/./отправка инкрементного списка файлов ./file1dir/dir/file3
Дает :
./file1:subdir ./file2:root./dir/file3:subdir./dir/file4:dir./subdir/dir/file3:subdir./subdir/file1:subdir
И затем для эмуляции mv
вы, вероятно, захотите удалить исходный каталог:
$ rm -r subdir/
Предоставление:
./file1: subdir./file2: parent./dir/file3: subdir./dir/file4: dir
Если это неверно, не могли бы вы привести аналогичный пример (например, используя мое тестовое дерево из верхней части этого ответа) с желаемым результатом?
8
rsync
может удалить исходный код после копирования с параметром - remove-source-files
.
Из rsync
справочная страница:
- отправитель remove-source-files удаляет синхронизированные файлы (не dir)
2
Вы можете сделать это с помощью cp
и rm
, но без копирования большого количества данных вы (предположительно) пытаетесь избежать передачи. @mattdm упомянул об этом в своем комментарии, а ответ на другой вопрос содержит более полное обсуждение различных параметров.
cp -rlf source destinationrm -r source
По сути, параметр -l
для команды cp
создает жесткие ссылки на файлы, а не копирует их данные в новые файлы. .
5
Вот скрипт, который перемещает файлы из-под /path/в/source/root
на соответствующий путь в /path/to/destination/root
.
- Если каталог существует как в источнике, так и в месте назначения, содержимое рекурсивно перемещается и объединяется.
- Если файл или каталог существует в источнике но не в месте назначения, он перемещается.
- Любой файл или каталог, который уже существует в месте назначения, остается. (В частности, объединенные каталоги остаются в исходном коде. Это нелегко исправить.)
Осторожно, непроверенный код.
экспорт dest = '/путь/к/месту назначения/root'cd/путь/к/источнику/rootfind. -type d (-exec sh -c '[-d "$ dest/$ 0"]' {} ; -o -exec sh -c 'mv "$ 0" "$ dest/$ 0"' {} ; -prune ) -o -exec sh -c 'if! [-e "$ dest/$ 0"]; затем mv -f "$ 0" "$ dest/$ 0"; fi '{} ;
3
Эта ветка существует уже много лет и по-прежнему занимает первое место в Google, поэтому я хотел добавить еще один метод. Как я обычно это делаю: упаковка содержимого подкаталога в tarball, перемещение tarball в родительский каталог, а затем извлеките его с поведением по умолчанию —overwrite. Это именно то, что вы ищете. После этого вы можете удалить свой подкаталог.
cd xyztar -cvzpf tmp.tar.gz * mv tmp.tar.gz ../tmp.tar.gzcd ..tar -xvzpf tmp.tar.gzrm -rf xyzrm -f tmp.tar.gz
2
Если у вас достаточно памяти, вы можете сделать это следующим образом:
mv -bfv directory_1/* directory_2 /# ко всем повторяющимся исходным файлам/каталогам # будет добавлено ~ .find -name "* ~" -delete # рекурсивно найдет и удалит все файлы # с ~ на конце
Убедитесь, что нет важных файлов с ~ на конце, но если они есть, вы можете добавить - suffix = whateveryouwant
вместо значения по умолчанию.