* [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: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
* 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 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 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
* 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: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
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