Я создал следующий скрипт, который перемещает старые файлы, как определено, из исходного каталога в целевой каталог. Работает отлично.
#!/bin/bash
echo "Enter Your Source Directory"
read soure
echo "Enter Your Destination Directory"
read destination
echo "Enter Days"
read days
find "$soure" -type f -mtime "-$days" -exec mv {} "$destination" \;
echo "Files which were $days Days old moved from $soure to $destination"
Этот скрипт отлично перемещает файлы, он также перемещает файлы из исходного подкаталога, но не создает подкаталог в целевой каталог. Я хочу реализовать эту дополнительную функцию в нем.
с примером
/home/ketan : source directory
/home/ketan/hex : source subdirectory
/home/maxi : destination directory
Когда я запускаю этот скрипт, он также перемещает файлы hex в макси-каталог, но мне нужно, чтобы тот же самый hex был создан в директории maxi и перемещал его файлы в тот же самый hex.
источник
for x do
Пропал;
там :). Кроме того, я понятия не имею, чего вы хотели достичь,$0
но я вполне уверен, что это будетsh
:).for x; do
технически несовместим с POSIX (проверьте грамматику ), но современные оболочки допускают какfor x do
иfor x; do
; некоторые старые снаряды Борна не грохнулиfor x; do
. На современных оболочках, сsh -c '…' arg0 arg1 arg2 arg3
,arg0
становится$0
,arg1
становится$1
и т. Д. Если хочешь$0
бытьsh
, нужно писатьsh -c '…' sh arg1 arg2 arg3
. Опять же, некоторые оболочки Bourne вели себя по-разному, но POSIX указывает это.pushd
кажется лучшим выборомcd
, так как он менее навязчив в текущую среду.Я знаю,
find
было указано, но это звучит как работа дляrsync
.Я чаще всего использую следующее:
Вот хороший пример, если вы хотите перемещать файлы только определенного типа ( пример ):
источник
--remove-source-files
было полезно, что фактически приводит к перемещению файлов вместо их копирования. Это удивительное использование rsync.Вы можете сделать это, используя два экземпляра find (1)
Там всегда cpio (1)
Проверьте аргументы для cpio. Те, которые я дал
источник
Это не так эффективно, но, на мой взгляд, код легче читать и понимать, если вы просто скопируете файлы, а затем удалите их.
Примечание: @MV обнаружил недостаток для автоматизированных операций:
источник
Вы можете сделать это, добавив абсолютный путь к файлу, возвращаемому
find
вашим путем:источник
$destination
содержит специальные символы, потому что оно подвергается расширению во внутренней оболочке. Может ты имел ввидуdestination='\'"$destination"\''
? Это все еще ломается'
. Кроме того, это создает файлы, такие как/home/maxi/home/ketan/hex/foo
вместо/home/maxi/hex/foo
.Лучше (быстрее и без использования места хранения путем копирования вместо перемещения), также не затрагиваются имена файлов, если они содержат специальные символы в своих именах:
Или быстрее, перемещая кучу файлов одновременно для нескольких процессоров, используя команду «параллельный»:
PS: У вас есть опечатка, «soure» должен быть «источником». Я сохранил имя переменной.
источник
Это менее элегантно, но легко, если количество / размер файлов не слишком велик
Сожмите ваши файлы вместе в
zip
архив, а затем распакуйте в место назначения без-j
опции. По умолчанию zip создаст относительную структуру каталогов.источник
Попробуйте так:
источник
Поскольку, кажется, нет действительно легкого решения этого вопроса, и оно мне нужно очень часто, я создал эту утилиту с открытым исходным кодом для Linux (требуется Python): https://github.com/benapetr/smv
Есть несколько способов, как вы можете использовать его для достижения того, что вам нужно, но, вероятно, самый простой будет что-то вроде этого:
Вы можете дополнительно запустить его в сухом режиме, чтобы он ничего не делал, кроме печати того, что он будет делать
Или в случае, если этот список файлов слишком длинный, чтобы поместиться в строку аргумента, и вы не против запустить python для каждого отдельного файла, тогда
источник