Date: Tue, 13 Apr 2004 13:42:19 +0100 From: Matthew Seaman <m.seaman@infracaninophile.co.uk> To: Peter Risdon <peter@circlesquared.com> Cc: FreeBSD Question List <freebsd-questions@freebsd.org> Subject: Re: Problems with filename with spaces (was Pipes and commands thatrequire two arguments) Message-ID: <20040413124219.GA92953@happy-idiot-talk.infracaninophile.co.uk> In-Reply-To: <407BC1F9.4050305@circlesquared.com> References: <40757879.1010307@circlesquared.com> <20040408165511.GD8182@dan.emsphone.com> <407BC1F9.4050305@circlesquared.com>
next in thread | previous in thread | raw e-mail | index | archive | help
--VS++wcV0S1rZb1Fb Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable On Tue, Apr 13, 2004 at 11:33:29AM +0100, Peter Risdon wrote: > Thanks very much for the previous help - I missed the example in man xarg= s. >=20 > The files I am trying to manipulate include spaces in the file names,=20 > and I cannot seem to escape them effectively. If I try something like: >=20 > #find /usr/home -name *.rtf.exe -print0 | perl -p -e 's/\ /\\\ /g;' |=20 > xargs -0 -J % mv % /usr/newplace/ >=20 > Then although all spaces are preceded by backslashes I get errors every= =20 > time a space is encountered. So for a file at /usr/home/user/this is a=20 > file.rtf.exe I get file does not exist errors from mv at: > /usr/home/user/this\ > and at: > is\ > and at: > a\ > and at: > file.rtf.exe (yes, a windows virus on a network share has been busy). >=20 > I have also tried >=20 > #find /usr/home -name *.rtf.exe -print0 | perl -p -e 's/\ /\\\ /g;' >=20 > listofdodgyfiles >=20 > and the list is fine. If I paste a line into mv on the command line, it= =20 > works. If I use a simple script to read the file, same errors as=20 > mentioned above. >=20 > I'm sure I'm missing something obvious... Any nudges in the right=20 > direction would be gratefully received. Errr... how about: # find /usr/home -name '*.rtf.exe' -print0 | \ xargs -0 -J % mv % /usr/newplace/ or # find /usr/home -name '*.rtf.exe' -print0 | \ perl -n0e '($x =3D $_) =3D~ s,^.*/,/usr/newplace/,; rename $_, $x;' Note: this puts all of those files into a single directory and doesn't do anything to avoid overwriting one file with another. I assume that's what you want. This sort of thing is the whole point of '-print0' -- it sidesteps all of the things the shell does with significant characters when it turns a command line into an argument list. ie. no escaping needed. Cheers, Matthew --=20 Dr Matthew J Seaman MA, D.Phil. 26 The Paddocks Savill Way PGP: http://www.infracaninophile.co.uk/pgpkey Marlow Tel: +44 1628 476614 Bucks., SL7 1TH UK --VS++wcV0S1rZb1Fb Content-Type: application/pgp-signature Content-Disposition: inline -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.4 (FreeBSD) iD8DBQFAe+ArdtESqEQa7a0RAip5AJ0eZKQjm1gV7Q8p5xBz+kdfoNHeqQCglWpp iV/A/Ke4GYY96fFnh8AqJIU= =ajiz -----END PGP SIGNATURE----- --VS++wcV0S1rZb1Fb--
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20040413124219.GA92953>