Bash-скрипт для перемещения файлов

Я новичок, и мне нужна помощь.

Я пытаюсь создать сценарий для перемещения некоторых файлов из одного каталога в другой каталог. Прежде чем создавать сценарий, который я тестировал команда и она работала:

  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 вместо значения по умолчанию.

Оцените статью
clickpad.ru
Добавить комментарий