- Копирование, перемещение, создание и удаление файлов и каталогов
- Копирование файлов и каталогов
- Перемещение и переименование
- Создание файлов и каталогов
- Удаление файлов и каталогов
- Помогите автоматизировать перемещение файлов
- скрипт для переноса файлов по одному или несколько
- ай да спасибо! ))
- Как написать скрипт по переносу файлов в linux с условием?
- Войдите, чтобы написать ответ
- Почему BASH скрипт по проверке самоподписанного SSl сертификата выдает неверную дату окончания и начала?
Копирование, перемещение, создание и удаление файлов и каталогов
Частыми операциями в файловой структуре являются создание файлов и каталогов, их копирование, перемещение, переименование, а также удаление. Очевидно для подобных действий в командной оболочке Linux должны быть предусмотрены специальные команды.
Копирование файлов и каталогов
В Bash для копирования файлов используется команда cp (от «copy»), которой обычно передаются два аргумента:
- адрес с именем исходного файла,
- новый адрес с именем или просто адрес каталога, куда помещается копия.
Адрес может быть как абсолютным, так относительным. Если операции с файлами выполняются в текущем каталоге, то указывать адрес смысла нет. Пишется только имя исходного файла и имя копии. Поскольку файлов с одинаковыми именами и адресами быть не может, имя копии должно отличаться от имени исходного файла.
В данном случае создается копия файла readme , которая остается в той же директории под именем readme2 .
В папку Desktop копируется файл readme . Здесь текущим является родительский Desktop’у каталог. Имена копии и файла оригинала будут совпадать, а вот полные адреса – нет.
cp /home/irina/tux.png /mnt/D/pingvin.png
Здесь копируется файл из одного каталога в другой, используются абсолютные адреса, имя копии изменяется.
Если надо скопировать несколько разных файлов в один и тот же каталог, то после команды cp сначала перечисляются все файлы-оригиналы, а последним указывается каталог, куда помещаются копии. Понятно, что при таком групповом действии имена файлов изменить не удастся.
Чтобы скопировать каталог со всем его содержимым, необходимо использовать ключ -r команды cp :
Перемещение и переименование
В Bash-оболочке Linux для перемещения и переименования используется одна и та же команда – mv (от «move» – перемещать). Переименование можно рассматривать как частный случай перемещения, ведь по-сути изменяется полный адрес файла, что равносильно перемещению, даже если файл остается в том же каталоге.
Также как в случае cp , для mv необходимо указать пару аргументов. Выбор между перемещением и переименованием зависит от того, что это за аргументы. При перемещении файл меняет свой адрес, следовательно, если в первом и втором аргументах указаны разные адреса, то произойдет перемещение. Если адреса одинаковые, а различаются только имена, происходит переименование. Кроме того, перемещение может быть совмещено с переименованием.
В случае перемещения без переименования во втором аргументе указывается только каталог места назначения.
mv document.txt Work/doc23.txt
Здесь в первом случае файл document.txt перемещается в каталог Work . Во-втором случае одновременно происходит перемещение файла и его переименование: document.txt перемещается в директорию Work и получает новое имя doc23.txt .
При использовании команды mv для переименования в качестве второго аргумента указывается новое имя:
mv Work/list.odt Work/names.odt
Каталоги перемещаются и переименовываются по тому же принципу, что и файлы (в отличие от cp ключ -r здесь не нужен).
Групповое перемещение файлов работает также, как с командой cp : сначала указываются перемещаемые объекты, в конце каталог назначения.
Создание файлов и каталогов
Новые директории создаются командой mkdir. Например, чтобы создать каталог Work в текущей директории необходимо выполнить следующую команду:
mkdir Work
или
mkdir ./Work
Существует множество способов создания файлов, обычно они создаются какой-либо программой. Если все же возникает необходимость создать пустой файл, сделать это можно с помощью программы touch . В качестве аргумента ей передается имя создаваемого файла. Еще один способ – перенаправление вывода какой-либо команды в файл. Пример:
Здесь программа cal выводит календарь на текущий месяц, а поскольку стоит знак перенаправления вывода, то вывод команды будет записан в файл January , находящийся в папке Work .
Удаление файлов и каталогов
Для удаления файлов используется команда rm. Например:
Командой rmdir можно удалить пустой каталог. Если же каталог не пуст, следует использовать команду rm с ключом -r :
У вас в каталоге есть файлы с разными расширениями. Вам надо группу файлов, имеющих одно и тоже расширение, скопировать в другой каталог. Как это сделать одной командой?
Какой ключ надо использовать, чтобы при перемещении случайно не перезаписать уже имеющийся в каталоге файл с таким именем?
Курс с ответами к заданиям и дополнительными уроками в PDF
Введение в Linux и Bash. Курс
Помогите автоматизировать перемещение файлов
Уважаемые форумчане,поставили задачу. Так как в скриптах не особо понимаю. Нужно написать скрипт для перемещение файлов из папки A в папку C. Если перемещение успешно и папка С доступна, то не перемещать в папку B. Если C не доступна, то только в B? Такое вообще возможно реализовать на линукс?
PunkoIvan ★★★★ ( 28.09.16 10:38:02 MSK )
Последнее исправление: PunkoIvan 28.09.16 10:38:51 MSK (всего исправлений: 1)
Такое вообще возможно реализовать на линукс?
Эту фичу пилят, в следующем релизе этих ваших линуксов будет говорят.
Это ни на одну тысячу строк кода. Пока с таким заданием только ИИ на нейронных сетях справляется.
Видишь, какой я добрый — я сделал приписку после «Возможно» хДД
По сути — делай сам и пиши сюда, что не получается, или вали в джобсы.
mv A/* C/ 2>/dev/null || mv A/* B/
Хватит рекламировать этот просроченный набор дурных примеров.
А что сейчас рекомендуешь почитать по теме bash scipting?
greenman ★★★★★ ( 28.09.16 11:18:50 MSK )
Последнее исправление: greenman 28.09.16 11:19:59 MSK (всего исправлений: 1)
Такое вообще возможно реализовать на линукс?
Линукс® и все? Можно и так, конечно, но это будут сотни строк на Си и еще несколько ассемблерных вставок.
Лучше взять еще хотя бы стандартную библиотеку; а еще лучше — определиться с тем, что у вас за операционная система, и посмотреть, нет ли в ней какого-нибудь командного интерпретатора и утилитки типа mv .
Zmicier ★★★★★ ( 28.09.16 11:22:12 MSK )
Последнее исправление: Zmicier 28.09.16 11:29:03 MSK (всего исправлений: 1)
Если помимо прилагаемого справочного руководства (reference manual), то материалы под редакцией Грега Вулиджа.
Я, вероятно, напрасно ввернул слово «простроченный». Дело не столько в том, что книжка Купера (а ее перевод в особенности) подустарели (хотя это правда), а в том, что это прекрасная коллекция примеров, как делать не надо. Одна только беда — эти примеры не помечены как вредные, они помечены как рекомендуемые; так что читать это можно только уже умея их видеть.
Zmicier ★★★★★ ( 28.09.16 11:26:54 MSK )
Последнее исправление: Zmicier 28.09.16 11:28:25 MSK (всего исправлений: 1)
Хватит рекламировать этот просроченный набор дурных примеров.
Для новичков — самое оно.
Если знаешь лучше — предложи. Чтобы на русском, с большим количеством примеров, и чтобы в одном месте не только bash, но и немного внешних команд было описано.
А приведи конкретику, милчеловек, а то что-то твой комментарий газификацию луж напоминает.
Да наверное надо бы уже сесть на час-другой да и перечитать все внимательно, уже с листочком и карандашом в руках, но вот как-то пока не сел. Пару примеров, если навскидку, вот я приводил. Начало десятой главы еще можно глянуть — тоже очень характерное.
Zmicier ★★★★★ ( 28.09.16 14:13:16 MSK )
Последнее исправление: Zmicier 28.09.16 14:15:25 MSK (всего исправлений: 2)
То есть идет перечисление арифметических возможностей ГНУ Баша, и ВНЕЗАПНО вылазит пример использования внешней утилиты expr.
Ты, видимо решил, что absg — это мануал по bash, но это не так. Мануал по bash — это man bash. ABSG — это учебник по написанию shell-скриптов с использованием bash, там приводятся примеры различных способов решения различных задач, и что такое expr там тоже описано.
Прекрасный коллекция косяков: для начала — вызов сценария через $ вместо назначения бита исполняемости как таковой
На файловой системе может быть использована опция монтирования noexec.
вызов сценария на Баше при помощи sh (привет, Кот), затем незакавыченная строковая переменная
Это придирки, которые в данном случае на результат не влияют. Тем более, что разница между bash и sh там описана, а так же описано, как нужно работать с переменными.
Black_Shadow ★★★★★ ( 28.09.16 15:13:57 MSK )
Последнее исправление: Black_Shadow 28.09.16 15:15:18 MSK (всего исправлений: 1)
Помогите автоматизировать перемещение файлов
Написание сценария на bash тебе уже советовали, добпвлю только две вещи:
1) Не пользуйся mv, а то мало ли что случится и копирование встанет.
Лучше сгачала cp, а потом после проверки удачности применить к источнику rm -fr ./
Но только осторожно, чтоб патч Брамина не получился.
2). Как я понимаю у тебя задача сделать бекап.
Может тебе лучше изучить использование rsync,
он update умеет, да ВРОДЕ и по сети передавать файлы на другой хост тоже.
Самый кошмар же не в этом, а в том что тебе надо настраивать запуск этого скрипта с помощью cron
С кроном,все просто. Самое сложное написать скрипт, так как в программирование не понимаю вообще!
из папки A в папку C. Если перемещение успешно и папка С доступна, то не перемещать в папку B
перемещение успешно и папка С доступна
После перемещения доступна или до? Или достаточно просто успешного перемещения в неё? Тогда ведь просто:
Правда это не переместит дотфайлы. Как переместить их тоже, догадаешься уж сам.
скрипт для переноса файлов по одному или несколько
Добрый день, форумчане. Возникла необходимость создать скрипт, который будет по крону переносить раз в минуту с папки один файл или несколько в другую папку. Как это правильно сделать, не знаю. Подскажите, кто сталкивался, как это реализовать правильно. Я так понимаю, что это может быть цикл, в котором будет указано, сколько раз его выполнять и сколько файлов брать. Заранее спасибо за ответ
cd DIR1 for i in $(ls -1 | head -n X); do mv $ DIR2; done
ай да спасибо! ))
работает )) спасибо большое )) моя голова почему-то до такого не додумалась ))
А как же проверка, что ″cd″ выполнился успешно?
$ ./test.sh remove "/tmp/wergwperpgwoerg1/a" $ ./test.sh remove "/tmp/wergwperpgwoerg1/b" $ ./test.sh remove "/tmp/wergwperpgwoerg1/c" $ ./test.sh $ cat test.sh #!/bin/bash function move() < if [ ! -d "$" ] || [ ! -d "$" ]; then return 1; fi cd -- "$"; if [ "$" != "0" ]; then return 1; fi for i in $(ls -1 | head -n $); do echo "remove \"$/$\""; mv "$" "$"; done return 0; > DIR1='/tmp/wergwperpgwoerg1'; DIR2='/tmp/wergwperpgwoerg2'; if [ ! -d "$" ] || [ ! -d "$" ]; then mkdir "$" &> /dev/null; mkdir "$" &> /dev/null; touch "$/a"; touch "$/b"; touch "$/c"; fi move "$" "$" 1;
Как написать скрипт по переносу файлов в linux с условием?
Как написать скрипт с условием: если в 1 папке больше 1000 файлов, то перенести то в папке 1 оставляем 1000 файлов, а остальные переносим в папку 2?
Пока только знаю эти две команды по переносу файлов.
cd /home/user/export/bin
mv * /mnt/receipt/bin
Теперь вам нужно узнать про команды, выводящие список файлов в столбик ls -1 и команду, считающую число строк wc -l , в процессе могут пригодиться head или tail для ограничения числа выводимых строк с путями файлов и xargs для передачи параметров в mv
P.S. вероятно, лучше использовать вместо ls -1 команду вида find . -type f с ключём -exec
читай описание
ls — листинг файлов директории
wc — подсчет строк в файле
т.е. скрипт будет типа такого
if [$(ls /path/to/dir | wc -l ) > 10**] then mv . fi
Если в директории нет файлов, названия которых начинаются с точки, то навскидку так будут перемещаться самые старые файлы оставляя в директории 1000 последних:
#!/usr/bin/env bash DIR1="/path/to/dir1" DIR2="/path/to/dir2" i=0 for f in $DIR1; do [[ -f $f ]] || continue _=$(( i++ )) done if $i -gt 1000; then count=$($i - 1000) files=$(find "$DIR1" -maxdepth 1 -type f -exec stat -c "%Y %n" <> \; | sort -rn | tail -n -"$count" | awk '') fi for file in $files; do mv "$file" $DIR2 done
declare -i CNT=0 for FILE in dir1/*; do if [[ $CNT -gt 1000 ]]; then mv $FILE dir2; fi CNT+=1 done