Why does `find -print0` still escape newlines?
I'm confused by this experiment (in Bash):
$ mkdir 'foon'
$ find . -print0 | od -c
0000000 . . / f o o n
0000012
As you can see, "find" is correctly delimiting the output with null characters, but it escapes the newline in the directory name as "foon" with a backslash "n". Why is it doing this? I told it "-print0" which says "This allows file names that contain newlines ... to be correctly interpreted by programs that process the find output." The escaping should not be necessary, since "" is the delimiter, not "n".
coreutils
add a comment |
I'm confused by this experiment (in Bash):
$ mkdir 'foon'
$ find . -print0 | od -c
0000000 . . / f o o n
0000012
As you can see, "find" is correctly delimiting the output with null characters, but it escapes the newline in the directory name as "foon" with a backslash "n". Why is it doing this? I told it "-print0" which says "This allows file names that contain newlines ... to be correctly interpreted by programs that process the find output." The escaping should not be necessary, since "" is the delimiter, not "n".
coreutils
You made a directory called literallyfoon
, with a backslash in its name.
– Michael Homer
2 mins ago
add a comment |
I'm confused by this experiment (in Bash):
$ mkdir 'foon'
$ find . -print0 | od -c
0000000 . . / f o o n
0000012
As you can see, "find" is correctly delimiting the output with null characters, but it escapes the newline in the directory name as "foon" with a backslash "n". Why is it doing this? I told it "-print0" which says "This allows file names that contain newlines ... to be correctly interpreted by programs that process the find output." The escaping should not be necessary, since "" is the delimiter, not "n".
coreutils
I'm confused by this experiment (in Bash):
$ mkdir 'foon'
$ find . -print0 | od -c
0000000 . . / f o o n
0000012
As you can see, "find" is correctly delimiting the output with null characters, but it escapes the newline in the directory name as "foon" with a backslash "n". Why is it doing this? I told it "-print0" which says "This allows file names that contain newlines ... to be correctly interpreted by programs that process the find output." The escaping should not be necessary, since "" is the delimiter, not "n".
coreutils
coreutils
asked 8 mins ago
MetamorphicMetamorphic
27618
27618
You made a directory called literallyfoon
, with a backslash in its name.
– Michael Homer
2 mins ago
add a comment |
You made a directory called literallyfoon
, with a backslash in its name.
– Michael Homer
2 mins ago
You made a directory called literally
foon
, with a backslash in its name.– Michael Homer
2 mins ago
You made a directory called literally
foon
, with a backslash in its name.– Michael Homer
2 mins ago
add a comment |
2 Answers
2
active
oldest
votes
The problem is not in find
, but in how you're creating this directory. The single quoted string 'foon'
is actually a 5-character string, of which the last two are a backslash and a lowercase "n".
Double-quoting it doesn't help either, since double-quoted strings in shell use backslash as an escape character, but don't really interpret any of the C-style backslash sequences.
In a shell such as bash or zsh, etc. (but not dash from Debian/Ubuntu), you can use $"..."
, which interprets those sequences:
$ mkdir $"foon"
Another option, that should work in any shell compatible with bourne shell is to insert an actual newline:
$ mkdir 'foo
'
That's an actual Return at the end of the first line, only closing the single quote on the second line.
add a comment |
Let's make a directory named foo
plus a newline:
$ mkdir $'foon'
Now, let's use find:
$ find . -print0 | od -c
0000000 . . / f o o n
0000011
n
is not escaped.
The issue is that 'foon'
is foo
followed by followed by
n
. We can verify that with:
$ printf '%s' 'foon' | od -c
0000000 f o o n
0000005
add a comment |
Your Answer
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "106"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: false,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: null,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f502460%2fwhy-does-find-print0-still-escape-newlines%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
The problem is not in find
, but in how you're creating this directory. The single quoted string 'foon'
is actually a 5-character string, of which the last two are a backslash and a lowercase "n".
Double-quoting it doesn't help either, since double-quoted strings in shell use backslash as an escape character, but don't really interpret any of the C-style backslash sequences.
In a shell such as bash or zsh, etc. (but not dash from Debian/Ubuntu), you can use $"..."
, which interprets those sequences:
$ mkdir $"foon"
Another option, that should work in any shell compatible with bourne shell is to insert an actual newline:
$ mkdir 'foo
'
That's an actual Return at the end of the first line, only closing the single quote on the second line.
add a comment |
The problem is not in find
, but in how you're creating this directory. The single quoted string 'foon'
is actually a 5-character string, of which the last two are a backslash and a lowercase "n".
Double-quoting it doesn't help either, since double-quoted strings in shell use backslash as an escape character, but don't really interpret any of the C-style backslash sequences.
In a shell such as bash or zsh, etc. (but not dash from Debian/Ubuntu), you can use $"..."
, which interprets those sequences:
$ mkdir $"foon"
Another option, that should work in any shell compatible with bourne shell is to insert an actual newline:
$ mkdir 'foo
'
That's an actual Return at the end of the first line, only closing the single quote on the second line.
add a comment |
The problem is not in find
, but in how you're creating this directory. The single quoted string 'foon'
is actually a 5-character string, of which the last two are a backslash and a lowercase "n".
Double-quoting it doesn't help either, since double-quoted strings in shell use backslash as an escape character, but don't really interpret any of the C-style backslash sequences.
In a shell such as bash or zsh, etc. (but not dash from Debian/Ubuntu), you can use $"..."
, which interprets those sequences:
$ mkdir $"foon"
Another option, that should work in any shell compatible with bourne shell is to insert an actual newline:
$ mkdir 'foo
'
That's an actual Return at the end of the first line, only closing the single quote on the second line.
The problem is not in find
, but in how you're creating this directory. The single quoted string 'foon'
is actually a 5-character string, of which the last two are a backslash and a lowercase "n".
Double-quoting it doesn't help either, since double-quoted strings in shell use backslash as an escape character, but don't really interpret any of the C-style backslash sequences.
In a shell such as bash or zsh, etc. (but not dash from Debian/Ubuntu), you can use $"..."
, which interprets those sequences:
$ mkdir $"foon"
Another option, that should work in any shell compatible with bourne shell is to insert an actual newline:
$ mkdir 'foo
'
That's an actual Return at the end of the first line, only closing the single quote on the second line.
answered 47 secs ago
filbrandenfilbranden
8,71621241
8,71621241
add a comment |
add a comment |
Let's make a directory named foo
plus a newline:
$ mkdir $'foon'
Now, let's use find:
$ find . -print0 | od -c
0000000 . . / f o o n
0000011
n
is not escaped.
The issue is that 'foon'
is foo
followed by followed by
n
. We can verify that with:
$ printf '%s' 'foon' | od -c
0000000 f o o n
0000005
add a comment |
Let's make a directory named foo
plus a newline:
$ mkdir $'foon'
Now, let's use find:
$ find . -print0 | od -c
0000000 . . / f o o n
0000011
n
is not escaped.
The issue is that 'foon'
is foo
followed by followed by
n
. We can verify that with:
$ printf '%s' 'foon' | od -c
0000000 f o o n
0000005
add a comment |
Let's make a directory named foo
plus a newline:
$ mkdir $'foon'
Now, let's use find:
$ find . -print0 | od -c
0000000 . . / f o o n
0000011
n
is not escaped.
The issue is that 'foon'
is foo
followed by followed by
n
. We can verify that with:
$ printf '%s' 'foon' | od -c
0000000 f o o n
0000005
Let's make a directory named foo
plus a newline:
$ mkdir $'foon'
Now, let's use find:
$ find . -print0 | od -c
0000000 . . / f o o n
0000011
n
is not escaped.
The issue is that 'foon'
is foo
followed by followed by
n
. We can verify that with:
$ printf '%s' 'foon' | od -c
0000000 f o o n
0000005
answered just now
John1024John1024
47k5110125
47k5110125
add a comment |
add a comment |
Thanks for contributing an answer to Unix & Linux Stack Exchange!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f502460%2fwhy-does-find-print0-still-escape-newlines%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
You made a directory called literally
foon
, with a backslash in its name.– Michael Homer
2 mins ago