LINUX.ORG.RU
ФорумAdmin

Переместить файлы с сохраненим прав, содержащие символы

 , , , ,


0

1

Добрый день!

Возникла загвоздка при написании скрипта.

В каталог /var/ftp/upload кидаются файлы записи разговоров формата 13-07-31__09-32_205_988007007757.mp3

Нужно выбрать файлы, содержащие «_205_» «_206_» и тд до «_900_» и переместить их в каталог /var/ftp/office/sales1 с сохранением прав.

В каталоге /vat/ftp/office/ три каталога: sales1, sales2, it.

Поскольку mv не умеет сохранять права, я пошел следующим путем:

#!/bin/sh
cp -p /var/ftp/upload*_205_* "/var/ftp/office/205/"
rm /var/ftp/upload_205_

Получаю ошибку:

cp: cannot stat ‘/*_205_*’: No such file or directory

Как я понимаю, он считает «/*_» за регулярку да и вообще не очень красиво вся конструкция выглядит, на каждый номер приходится писать отдельную строчку.

Как можно сделать так, чтобы в скрипте был список номеров, которые должны лежать в каталогах sales1, sales2 и it, например: номера 205,206,207 должны падать в ./sales1/205/* и тд.

Скрипт находил файлы формата _xxx_, где x - целое число, проверял есть ли каталог с таким именем в ./sales1/ или ./sales2/, если нет, то создавал и перемещал с сохранением прав, если есть то просто перемещал.


#!/bin/bash

for i in `ls /var/ftp/upload*_205_*`

do

cp $i ...

done

А вообще-то tar умеет сохранять права и cp с ключиками -p, --preserve

И кто тебе мешает после копирования права назначить, как нужно

ansky ★★★★★
()

Поскольку mv не умеет сохранять права

?? o_O

# cd /tmp
# touch test1.txt
# chown balancer: test1.txt
# chmod 0557 test1.txt
# mkdir test
# mv test1.txt test/
# ls -l test/
итого 0
-r-xr-xrwx 1 balancer balancer 0 сент. 26 09:40 test1.txt

Собственно, mv при работе на том же томе вообще ничего с файлом не делает, только inode меняет.

KRoN73 ★★★★★
()
Ответ на: комментарий от ansky

и cp с ключиками -p, --preserve

У него, вообще, есть мега-ключик -a (--archive) :)

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

омг, как я оплошал....))

а по какой причине он ошибку-то выдает?

cp: cannot stat ‘/*_205_*’: No such file or directory

r1sh
() автор топика
Ответ на: комментарий от ansky

в каталоге /var/ftp/upload лежат файлы типа:

13-08-13__11-04_770_208.mp3 13-08-13__11-04_897_989502272643.mp3 13-08-13__11-06_277_989312313969.mp3 13-08-13__11-09_232_770.mp3

доб.номера у нас преимущественно 7хх и 8хх, но есть и 200 400.

Если делать просто цикл for то не упарится ли он перебирать 1000 значений?

r1sh
() автор топика

Судя по тегу asterisk - это его записи разговоров. Что-то мне подсказывает, что задача изначально решается не очень правильно.

kernelpanic ★★★★★
()
Ответ на: комментарий от r1sh

Если делать просто цикл for то не упарится ли он перебирать 1000 значений?

А ты попробуй. Если ты в сторону cp передаешь по звездочке 1000 имен, то эта хрень может вообще не завершиться. Так что это зависит.

ansky ★★★★★
()

cp -p /var/ftp/upload*_205_* «/var/ftp/office/205/»

Между upload и *_205_* разве не должно быть слэша? Или это опечатка?

fbiagent ★★★
()
Ответ на: комментарий от r1sh

а по какой причине он ошибку-то выдает?

cp: cannot stat ‘/*_205_*’: No such file or directory

Это поведение согласно стандарту. Слэши не подпадают под паттерн звёздочки.

См. http://pubs.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html#tag_...

А именно параграф:

The slash character in a pathname shall be explicitly matched by using one or more slashes in the pattern; it shall neither be matched by the asterisk or question-mark special characters nor by a bracket expression. Slashes in the pattern shall be identified before bracket expressions; thus, a slash cannot be included in a pattern bracket expression used for filename expansion. If a slash character is found following an unescaped open square bracket character before a corresponding closing square bracket is found, the open bracket shall be treated as an ordinary character. For example, the pattern «a[b/c]d» does not match such pathnames as abd or a/d. It only matches a pathname of literally a[b/c]d.

Т.о. твой паттерн соотвествует всем файлам в каталоге /var/ftp/ начинающимся на upload и т.д., но не файлам в подкаталоге upload.

Как уже написал fbiagent, маска файлов, которая тебе нужна, это:

/var/ftp/upload/*_205_*

unterwulf
()

Как можно сделать так, чтобы в скрипте был список номеров, которые должны лежать в каталогах sales1, sales2 и it, например: номера 205,206,207 должны падать в ./sales1/205/* и тд.

Я бы сделал так:

  • В подкаталоге каждого отдела завёл бы файл extensions, в который бы по одному на строке записал все номера этого отдела.
  • В /var/ftp/office/ завёл бы файл departments, в который бы по одному на строке записал имена каталогов всех отделов.
  • В скрипте бы сделал что-то вроде (не проверял):
    while read dep; do
      while read ext; do
        mkdir -p /var/ftp/office/$dep/$ext
        mv /var/ftp/upload/*_${ext}_* /var/ftp/office/$dep/$ext/
      done < /var/ftp/office/$dep/extensions
    done < /var/ftp/office/departments
    
unterwulf
()
Ответ на: комментарий от FreeBSD

На сколько я понимаю эти номера достаточно произвольные, нумерация с пробелами и так далее. в прочем автору темы виднее как в его случае удобнее, пусть сам решает.

MrClon ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.