* Re: [gentoo-user] Cloning a directory hierarchy, but not the content
2011-01-29 13:58 [gentoo-user] Cloning a directory hierarchy, but not the content Alex Schuster
@ 2011-01-29 13:54 ` Etaoin Shrdlu
2011-01-29 14:27 ` Alex Schuster
2011-01-29 14:39 ` Florian Philipp
1 sibling, 1 reply; 10+ messages in thread
From: Etaoin Shrdlu @ 2011-01-29 13:54 UTC (permalink / raw
To: gentoo-user
On Sat, 29 Jan 2011 14:58:13 +0100
Alex Schuster <wonko@wonkology.org> wrote:
> Hi there!
>
> I am currently putting extra backups to old hard drives I do no longer
> need for other purposes. After that I send the putput out ls -lR and du
> -m to my log directory so I can check what files are on which drive
> without having to attach the drive.
>
> Works, though a better method would be to clone the drive's root
> directory, but with all file sizes being zero. This way I can easily
> navigate the directory structure, instead of browsing through the ls-lR
> file. Is there a utility that does this? It would be even better if the
> files would be created as sparse files, faking the original size.
>
> I just wrote a little script that does this, but it does not do the
> sparse file thing yet, and would have problems with newline in file
> names. And I guess someone already wrote such a utility?
IIUC, try
find / -type d -exec sh 'mkdir -p target"$1"' - {} \;
^ permalink raw reply [flat|nested] 10+ messages in thread
* [gentoo-user] Cloning a directory hierarchy, but not the content
@ 2011-01-29 13:58 Alex Schuster
2011-01-29 13:54 ` Etaoin Shrdlu
2011-01-29 14:39 ` Florian Philipp
0 siblings, 2 replies; 10+ messages in thread
From: Alex Schuster @ 2011-01-29 13:58 UTC (permalink / raw
To: gentoo-user
Hi there!
I am currently putting extra backups to old hard drives I do no longer need
for other purposes. After that I send the putput out ls -lR and du -m to my
log directory so I can check what files are on which drive without having to
attach the drive.
Works, though a better method would be to clone the drive's root directory,
but with all file sizes being zero. This way I can easily navigate the
directory structure, instead of browsing through the ls-lR file. Is there a
utility that does this? It would be even better if the files would be
created as sparse files, faking the original size.
I just wrote a little script that does this, but it does not do the sparse
file thing yet, and would have problems with newline in file names. And I
guess someone already wrote such a utility?
Wonko
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [gentoo-user] Cloning a directory hierarchy, but not the content
2011-01-29 13:54 ` Etaoin Shrdlu
@ 2011-01-29 14:27 ` Alex Schuster
2011-01-29 14:36 ` Etaoin Shrdlu
0 siblings, 1 reply; 10+ messages in thread
From: Alex Schuster @ 2011-01-29 14:27 UTC (permalink / raw
To: gentoo-user
Etaoin Shrdlu writes:
> On Sat, 29 Jan 2011 14:58:13 +0100
>
> Alex Schuster <wonko@wonkology.org> wrote:
> > Hi there!
> >
> > I am currently putting extra backups to old hard drives I do no longer
> > need for other purposes. After that I send the putput out ls -lR and du
> > -m to my log directory so I can check what files are on which drive
> > without having to attach the drive.
> >
> > Works, though a better method would be to clone the drive's root
> > directory, but with all file sizes being zero. This way I can easily
> > navigate the directory structure, instead of browsing through the ls-lR
> > file. Is there a utility that does this? It would be even better if the
> > files would be created as sparse files, faking the original size.
> >
> > I just wrote a little script that does this, but it does not do the
> > sparse file thing yet, and would have problems with newline in file
> > names. And I guess someone already wrote such a utility?
>
> IIUC, try
>
> find / -type d -exec sh 'mkdir -p target"$1"' - {} \;
Hmm, that does not really seem to work. It tries to execute the whole stuff
between single quotes as a command. And I don't really understand what it is
supposed to do, shouldn't this be something like mkdir -p
/destination/$1/\{\} ?
Anyway, this is what I already have. It duplicates the hierarchy with empty
files, but I have to add support for sparse files. That won't be too hard,
but maybe I'm re-inventing the wheel here.
#!/bin/bash
src=$1
dst=$2
cd "$src" || exit $?
IFS=$'\n'
find . |
while read file
do
if [[ -d $file ]]
then
[[ -d "$dst/$file" ]] ||
mkdir -p "$dst/$file"
elif [[ -f $file ]]
then
[[ -d "$dst/${file%/*}" ]] ||
mkdir -p "$dst/${file%/*}"
touch "$dst/$file"
fi
done
Wonko
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [gentoo-user] Cloning a directory hierarchy, but not the content
2011-01-29 14:27 ` Alex Schuster
@ 2011-01-29 14:36 ` Etaoin Shrdlu
2011-01-29 16:45 ` Alex Schuster
0 siblings, 1 reply; 10+ messages in thread
From: Etaoin Shrdlu @ 2011-01-29 14:36 UTC (permalink / raw
To: gentoo-user
On Sat, 29 Jan 2011 15:27:59 +0100 Alex Schuster <wonko@wonkology.org>
wrote:
> > > I just wrote a little script that does this, but it does not do the
> > > sparse file thing yet, and would have problems with newline in file
> > > names. And I guess someone already wrote such a utility?
> >
> > IIUC, try
> >
> > find / -type d -exec sh 'mkdir -p target"$1"' - {} \;
>
> Hmm, that does not really seem to work. It tries to execute the whole
> stuff between single quotes as a command. And I don't really understand
> what it is supposed to do, shouldn't this be something like mkdir -p
> /destination/$1/\{\} ?
No. That recreates the full directory hierarchy based at / under /target/,
with no files in it. Just the directory hierarchy. I should have added
that, to do it safely, the target should reside higher than the source in
the hierarchy, or it should be on a different filesystem and in that case
-xdev should be specified to find (otherwise an recursive loop would
result).
A more sensible approach would probably be
cd /source && find . -type d -exec bash 'mkdir -p "${@/#//target/}"' - {} +
with -xdev if needed. But as I see now, this is not what you wanted, so
ignore it.
> Anyway, this is what I already have. It duplicates the hierarchy with
> empty files, but I have to add support for sparse files. That won't be
> too hard, but maybe I'm re-inventing the wheel here.
>
> #!/bin/bash
>
> src=$1
> dst=$2
>
> cd "$src" || exit $?
> IFS=$'\n'
> find . |
> while read file
> do
> if [[ -d $file ]]
> then
> [[ -d "$dst/$file" ]] ||
> mkdir -p "$dst/$file"
> elif [[ -f $file ]]
> then
> [[ -d "$dst/${file%/*}" ]] ||
> mkdir -p "$dst/${file%/*}"
> touch "$dst/$file"
> fi
> done
Ok, I misunderstood. You also want the files but empty. Why do you need
support for sparse files? Do you need to manage other types of file
(symlinks, FIFOs, etc.)
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [gentoo-user] Cloning a directory hierarchy, but not the content
2011-01-29 13:58 [gentoo-user] Cloning a directory hierarchy, but not the content Alex Schuster
2011-01-29 13:54 ` Etaoin Shrdlu
@ 2011-01-29 14:39 ` Florian Philipp
2011-01-29 19:31 ` Alex Schuster
1 sibling, 1 reply; 10+ messages in thread
From: Florian Philipp @ 2011-01-29 14:39 UTC (permalink / raw
To: gentoo-user
[-- Attachment #1: Type: text/plain, Size: 1514 bytes --]
Am 29.01.2011 14:58, schrieb Alex Schuster:
> Hi there!
>
> I am currently putting extra backups to old hard drives I do no longer need
> for other purposes. After that I send the putput out ls -lR and du -m to my
> log directory so I can check what files are on which drive without having to
> attach the drive.
>
> Works, though a better method would be to clone the drive's root directory,
> but with all file sizes being zero. This way I can easily navigate the
> directory structure, instead of browsing through the ls-lR file. Is there a
> utility that does this? It would be even better if the files would be
> created as sparse files, faking the original size.
>
> I just wrote a little script that does this, but it does not do the sparse
> file thing yet, and would have problems with newline in file names. And I
> guess someone already wrote such a utility?
>
> Wonko
>
Use `truncate -s <size> <file>`
It creates a sparse file if the specified file is smaller than the
specified size. It will also create a new file if it does not yet exist.
In order to avoid trouble with line breaks in names, I recommend
something like:
find . -type f -print0 |
while read -d $'\0' file; do
echo "File=$file"
done
Or use similar commands accepting or outputting 0-byte terminated
strings, for example xargs -0, du -0, grep -z.
For copying file attributes from one file to another you can use `cp
--attributes-only`.
Hope this helps,
Florian Philipp
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 262 bytes --]
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [gentoo-user] Cloning a directory hierarchy, but not the content
2011-01-29 14:36 ` Etaoin Shrdlu
@ 2011-01-29 16:45 ` Alex Schuster
2011-01-29 18:59 ` Etaoin Shrdlu
0 siblings, 1 reply; 10+ messages in thread
From: Alex Schuster @ 2011-01-29 16:45 UTC (permalink / raw
To: gentoo-user
Etaoin Shrdlu writes:
> On Sat, 29 Jan 2011 15:27:59 +0100 Alex Schuster <wonko@wonkology.org>
> wrote:
> > > > I just wrote a little script that does this, but it does not do the
> > > > sparse file thing yet, and would have problems with newline in file
> > > > names. And I guess someone already wrote such a utility?
> > >
> > > IIUC, try
> > >
> > > find / -type d -exec sh 'mkdir -p target"$1"' - {} \;
> >
> > Hmm, that does not really seem to work. It tries to execute the whole
> > stuff between single quotes as a command. And I don't really understand
> > what it is supposed to do, shouldn't this be something like mkdir -p
> > /destination/$1/\{\} ?
>
> No. That recreates the full directory hierarchy based at / under
> /target/, with no files in it. Just the directory hierarchy.
Ah, now I get it. There's a -c missing after the sh command.
> I should
> have added that, to do it safely, the target should reside higher than
> the source in the hierarchy, or it should be on a different filesystem
> and in that case -xdev should be specified to find (otherwise an
> recursive loop would result).
Right, but not important in my case. I want to mount my backup drive to
/mnt, cd /mnt, and duplicate all stuff soemwhere else, without taking up
much space. Then I can remove the backup drive and I only have to mount it
again when I need a file's content, but not for finding out which files
there are and how much space they take. Well, the space already is in the
file created by du -m, but I'd like to directly navigate around.
> Ok, I misunderstood. You also want the files but empty. Why do you need
> support for sparse files? Do you need to manage other types of file
> (symlinks, FIFOs, etc.)
Yes, symlinks would ne nice, too, I forgot about them. The rest is
unimportant, as this would be data only, not root file systems. I backup
that with rdiff-backup to a 2nd drive, but there's much other stuff that I
would like to put on one of the old drives that lie around here.
Sparse files would be nice because then I do not only have the same logical
structure, the files also appear to have the same size as the originals,
instead of having a size of 0. I could navigate and explore the directory
structure with mc, and with du --apparent-size I could find out how much
space a subdirectory takes. Again, my du -m file already has this
information, but while navigating in the directory tree, being able to use
du would be nice.
Wonko
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [gentoo-user] Cloning a directory hierarchy, but not the content
2011-01-29 16:45 ` Alex Schuster
@ 2011-01-29 18:59 ` Etaoin Shrdlu
2011-01-29 23:51 ` Alex Schuster
0 siblings, 1 reply; 10+ messages in thread
From: Etaoin Shrdlu @ 2011-01-29 18:59 UTC (permalink / raw
To: gentoo-user
On Sat, 29 Jan 2011 17:45:30 +0100 Alex Schuster <wonko@wonkology.org>
wrote:
> Ah, now I get it. There's a -c missing after the sh command.
Right, thans for spotting it.
> > I should have added that, to do it safely, the target should reside
> > higher than the source in the hierarchy, or it should be on a different
> > filesystem and in that case -xdev should be specified to find
> > (otherwise an recursive loop would result).
>
> Right, but not important in my case. I want to mount my backup drive to
> /mnt, cd /mnt, and duplicate all stuff soemwhere else, without taking up
> much space. Then I can remove the backup drive and I only have to mount
> it again when I need a file's content, but not for finding out which
> files there are and how much space they take. Well, the space already is
> in the file created by du -m, but I'd like to directly navigate around.
Oh, I see now: you want the files to *look like* the real ones (eg when
doing ls -l etc.), but be sparse so they don't take up space?
> Sparse files would be nice because then I do not only have the same
> logical structure, the files also appear to have the same size as the
> originals, instead of having a size of 0. I could navigate and explore
> the directory structure with mc, and with du --apparent-size I could find
> out how much space a subdirectory takes. Again, my du -m file already has
> this information, but while navigating in the directory tree, being able
> to use du would be nice.
Ok, one way to create a sparse file of, say, 1 megabyte is using dd:
# dd if=/dev/null of=sparsefile bs=1 seek=1M
0+0 records in
0+0 records out
0 bytes (0 B) copied, 2.5419e-05 s, 0.0 kB/s
# ls -l sparsefile
-rw-r--r-- 1 root root 1048576 Jan 29 11:57 sparsefile
# du -B1 sparsefile
0 sparsefile
Another way, already suggested, is by using truncate, eg
# truncate -s 1M sparsefile
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [gentoo-user] Cloning a directory hierarchy, but not the content
2011-01-29 14:39 ` Florian Philipp
@ 2011-01-29 19:31 ` Alex Schuster
2011-01-29 21:14 ` Florian Philipp
0 siblings, 1 reply; 10+ messages in thread
From: Alex Schuster @ 2011-01-29 19:31 UTC (permalink / raw
To: gentoo-user
Florian Philipp writes:
> Use `truncate -s <size> <file>`
>
> It creates a sparse file if the specified file is smaller than the
> specified size. It will also create a new file if it does not yet exist.
Nice one. First I did not see an improvement over using dd to create the
sparse file, but in combination with cp --attributes-only I can now
duplicate the file with its attributes but zero size, and then fake the
size.
> In order to avoid trouble with line breaks in names, I recommend
> something like:
> find . -type f -print0 |
> while read -d $'\0' file; do
> echo "File=$file"
> done
Thanks!
> For copying file attributes from one file to another you can use `cp
> --attributes-only`.
Oh my, another case of a (german) man page that does not show all the
possible arguments. Never heard about that, thanks!
Wonko
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [gentoo-user] Cloning a directory hierarchy, but not the content
2011-01-29 19:31 ` Alex Schuster
@ 2011-01-29 21:14 ` Florian Philipp
0 siblings, 0 replies; 10+ messages in thread
From: Florian Philipp @ 2011-01-29 21:14 UTC (permalink / raw
To: gentoo-user
[-- Attachment #1: Type: text/plain, Size: 706 bytes --]
Am 29.01.2011 20:31, schrieb Alex Schuster:
> Florian Philipp writes:
[...]
>
>
>> For copying file attributes from one file to another you can use `cp
>> --attributes-only`.
>
> Oh my, another case of a (german) man page that does not show all the
> possible arguments. Never heard about that, thanks!
>
> Wonko
>
The German man-pages can be a real pain. Guess there are too few people
who keep them up-to-date. Oh well ... maybe some day when I have more time.
Until then I make it a point to never install them in the first place
when I can avoid it:
`LINGUAS='en' emerge -1 man-pages && emerge -C man-pages-de`
Or I just delete them with `rm -r /usr/share/man/de*` :)
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 262 bytes --]
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [gentoo-user] Cloning a directory hierarchy, but not the content
2011-01-29 18:59 ` Etaoin Shrdlu
@ 2011-01-29 23:51 ` Alex Schuster
0 siblings, 0 replies; 10+ messages in thread
From: Alex Schuster @ 2011-01-29 23:51 UTC (permalink / raw
To: gentoo-user
Etaoin Shrdlu writes:
> On Sat, 29 Jan 2011 17:45:30 +0100 Alex Schuster <wonko@wonkology.org>
> wrote:
>>> I should have added that, to do it safely, the target should reside
>>> higher than the source in the hierarchy, or it should be on a different
>>> filesystem and in that case -xdev should be specified to find
>>> (otherwise an recursive loop would result).
>>
>> Right, but not important in my case. I want to mount my backup drive to
>> /mnt, cd /mnt, and duplicate all stuff soemwhere else, without taking up
>> much space. Then I can remove the backup drive and I only have to mount
>> it again when I need a file's content, but not for finding out which
>> files there are and how much space they take. Well, the space already is
>> in the file created by du -m, but I'd like to directly navigate around.
>
> Oh, I see now: you want the files to *look like* the real ones (eg when
> doing ls -l etc.), but be sparse so they don't take up space?
Exactly. Sorry I did not make myself clearer.
It's working now, and I like it :) I added some more features, like
clipping files to a maximum size. So the clone can still be very small
compared to the original, with small files being intact and usable.
> Ok, one way to create a sparse file of, say, 1 megabyte is using dd:
>
> # dd if=/dev/null of=sparsefile bs=1 seek=1M
> 0+0 records in
> 0+0 records out
> 0 bytes (0 B) copied, 2.5419e-05 s, 0.0 kB/s
> # ls -l sparsefile
> -rw-r--r-- 1 root root 1048576 Jan 29 11:57 sparsefile
> # du -B1 sparsefile
> 0 sparsefile
That's how I wanted to do it first, too.
> Another way, already suggested, is by using truncate, eg
>
> # truncate -s 1M sparsefile
I used this, because so I can modify a file that I created empty with cp
--attributes-only. Keeping the attributes would have been a bit complicated.
In case anyone else is interested, the script is here:
http://www.wonkology.org/utils/clone0
wonko@weird ~ $ clone0 -h
clone0 version 2011-01-29
Duplicate a file / directory hierarchy. Files are
created as sparse files, not taking up real space.
Usage: clone0 [-dhSv0] [-s size] src... dst
Options:
-d clone directory structure only, not files
-h show this help
-s size copy files up to size as the are, and clip larger files
-S do not create sparse files
-v show directories being created
-vv show files being created
-vvv debug output
-0 clip files larger than size (option -s) to zero size
Arguments:
src... one or more directories to clone
dst destination directory (will be created)
Thanks for the input, guys!
Wonko
^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2011-01-30 0:05 UTC | newest]
Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-01-29 13:58 [gentoo-user] Cloning a directory hierarchy, but not the content Alex Schuster
2011-01-29 13:54 ` Etaoin Shrdlu
2011-01-29 14:27 ` Alex Schuster
2011-01-29 14:36 ` Etaoin Shrdlu
2011-01-29 16:45 ` Alex Schuster
2011-01-29 18:59 ` Etaoin Shrdlu
2011-01-29 23:51 ` Alex Schuster
2011-01-29 14:39 ` Florian Philipp
2011-01-29 19:31 ` Alex Schuster
2011-01-29 21:14 ` Florian Philipp
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox