LINUX.ORG.RU

рекурсивно скопировать файлы через «cat oldfile > newfile»

 


1

2

Помогите с однострочником, плиз.
Нужно рекурсивно скопировать файлы через «cat oldfile > newfile». Зачем мне так извращаться? У меня тут произошел какой-то косяк с файловой системой udf, я о нем тут писал Работа с разделом udf на hdd. В Linux с файлами всё нормально, а в Windows - всё стало read-only. Однако вчера обнаружил, что в Linux тоже не всё в порядке. Я ничего не могу скопировать в другое место. И cp и tar выдают какую-то загадочную ошибку «Превышен лимит размера файла», зато cat читает всё нормально.
Как мне это сделать? Что-то вроде:

#!/bin/bash
find /srv | while read FILENAME
do
   cat "$FILENAME" > /home/iskatel/newdir/"$FILENAME"
done
Всё бы ничего, но /srv содержит подкаталоги и такой способ не прокатит. Как быть?

★★★★★
Ответ на: zsh от zolden

А как у меня таким способом создастся например файл /home/iskatel/newdir/adminfiles/scripts/sbackup.sh если каталога /home/iskatel/newdir/adminfiles/scripts пока не существует?

sunny1983 ★★★★★
() автор топика
Последнее исправление: sunny1983 (всего исправлений: 1)
Ответ на: комментарий от salsa

или, например, так

% dirs=(**/*(/))
% mkdir -p /home/iskatel/newdir/${^dirs}

salsa
()
Ответ на: zsh от zolden

Тег же bash, так что

shopt -s globstar
for file in /srv/**/*; do cat "$file" > /home/iskatel/newdir/"$file"; done

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

Выберет, но так как тот вариант не был полностью рабочим, я тоже не особо аккуратно делал. Вообще, что-то в таком стиле надо:

shopt -s globstar
for file in /srv/**/*; do
    if [ -d "$file" ]; then
        mkdir -p /home/iskatel/newdir/"$file"
    else
        cat "$file" > /home/iskatel/newdir/"$file"
    fi
done

# либо

shopt -s globstar
for file in /srv/**/*/; do mkdir -p /home/iskatel/newdir/"$file"; done
for file in /srv/**/*; do cat "$file" > /home/iskatel/newdir/"$file"; done
Ещё судя по ошибке, кажется, стоит воспользоваться ulimit, а потом уже нормально cp сделать. Хотя ограничение может и в другом месте накладываться (и может проще от рута с сохранением атрибутов скопировать).

xaizek ★★★★★
()
Последнее исправление: xaizek (всего исправлений: 1)
Ответ на: комментарий от xaizek

Хмм... а я ведь с ulimit как раз игрался. В /etc/login.defs строку ULIMIT раскомментировал, надеялся этим способом предупреждение samba убрать. У меня Slackware.

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

У меня там предел 2097152 блоков по 512 байт, т.е. 1 ГиБ максимум. cat его естественно не обойдёт, он просто перестанет работать после записи 1 ГиБ, cp и tar может место резервируют и поэтому быстрее выдают ошибку.

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

Скрипт не пригодился. Вернул ulimit на место и «косяк с файловой системой» сам изчез.

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