git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: git-clean fails to remove a file whose name contains \\, ", or \n, TAB, etc.

From
JHJan Hudec <bulb@ucw.cz>
Date
May 8, 2007, 23:11 UTC
Message-ID
<20070508231115.GA14900@efreet.light.src>
In-Reply-To
<86k5vj9gzu.fsf@blue.stonehenge.com>
On Tue, May 08, 2007 at 13:51:01 -0700, Randal L. Schwartz wrote:
Show 15 quoted lines
> >>>>> "Jim" == Jim Meyering <jim@meyering.net> writes:
> 
> Jim> Not that it matters (or maybe this is a feature :-), because people
> Jim> who create such files in their working directory deserve what they
> Jim> get, Eh? :-)
> 
> The problem is the newline in the string, since
> 
>   git-ls-files --others --directory $excl ${excl_info:+"$excl_info"} -- "$@" |
>   while read -r file; do
> 
> is using newline as a delimiter.  Any file with a newline would mess this up.
> 
> Not being a shell programming expert, is there a way we could use -z and xargs
> -0 here instead?

Unfortunately read does not have zero-delimited mode (at all). Unfortunately the backquote expansion does not preserve whitespace correctly, so it's not possible to use something like head.

Unfortunately there does not seem to be a way to feed newline to read (without -r flag), because the rules say that '\<NL>' => '' and '\<something>' => '<something>'.

Than I can't think of anything other than xargs -0. Unfortunately that is an external command, which only handles simple commands. So the question becomes how to give it a simple command. Well, there would be two ways:

 - A simple command might be:
	sh -c 'arbitrarily complex command' dummy arguments...
   (the "dummy" will become $0),
   so you can simply put the whole loop in single quotes, use for file; do
   instead of while read -r file; do and be done.
 - Reinvoke the program with special argument meaning it should run the inner
   loop. Ie. add an option --inner-loop option, that would run the
   inner loop and terminate and use xargs -0 "$0" --inner-loop
Both solutions require exporting all the necessary variables.
-- 
						 Jan 'Bulb' Hudec <bulb@ucw.cz>
Previous: Junio C HamanoNext: Randal L. Schwartz
Message 4 of 8 in “git-clean fails to remove a file whose name contains \\, ", or \n, TAB, etc.”
  1. Jim MeyeringMay 8, 2007
  2. Randal L. SchwartzMay 8, 2007
  3. Junio C HamanoMay 8, 2007
  4. Jan HudecMay 8, 2007
  5. Randal L. SchwartzMay 8, 2007
  6. Karl HasselströmMay 8, 2007
  7. Randal L. SchwartzMay 8, 2007
  8. Karl HasselströmMay 8, 2007

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.