bash cp -r за исключением определенного типа файла - PullRequest
0 голосов
/ 22 октября 2011

У меня есть скрипт bash, который содержит:

for i in $(stuff);
do other-stuff; cp -r $i $p;
done

, но у меня нет разрешения на чтение для определенного типа файла дампа журнала, давайте назовем его .txt

В настоящее время я получаю: cp: не могу открыть `file.txt 'для чтения: В доступе отказано

Без изменения каких-либо разрешений, есть ли простой способ скопировать все, кроме этих файлов?

Ответы [ 3 ]

1 голос
/ 22 октября 2011

cp не зависает при генерации этого сообщения. Это просто пропускает файл. Добавьте подробный текст (cp -vr $i $p), и вы увидите, что он либо занят копированием других файлов, либо, наоборот, что-то еще в вашем скрипте зависает.

cp на самом деле не имеет способа исключить файлы, из которых он рекурсивно перезаписывается. Если вы хотите этого, вам придется переключиться на что-то более функциональное, например tar (возможно, с find) или rsync.

Кроме того, вы должны действительно процитировать свои аргументы, на случай, если они содержат пробелы: cp -r "$i" "$p"

1 голос
/ 22 октября 2011

Проверьте, доступен ли файл для чтения текущему пользователю с помощью if [ -r "$i" ]:

for i in $(stuff);
    if [ -r "$i" ]; do
        cp -r $i $p
    fi
done

Более подробная информация здесь: Операторы проверки файлов

ФлагВозвращает истину, если ...-rфайл имеет разрешение на чтение (для пользователя, выполняющего тест)

-wфайл имеет разрешение на запись (для пользователя, выполняющего тест)

-xфайл имеет разрешение на выполнение (для пользователя, выполняющего тест)

0 голосов
/ 22 октября 2011
do other-stuff; $i =~ "*.txt" || cp -r $i $p;

Возможно, вам понадобится группировка здесь; Я не проверял приоритеты оператора и не могу держать их всех в голове. Но ~= делает регулярное выражение. Если это удастся, копия будет пропущена.

...