Why does `find -print0` still escape newlines?












1















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".









share























  • You made a directory called literally foon, with a backslash in its name.

    – Michael Homer
    2 mins ago


















1















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".









share























  • You made a directory called literally foon, with a backslash in its name.

    – Michael Homer
    2 mins ago
















1












1








1








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".









share














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





share












share










share



share










asked 8 mins ago









MetamorphicMetamorphic

27618




27618













  • 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



















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












2 Answers
2






active

oldest

votes


















0














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.





share































    0














    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




    share























      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
      });


      }
      });














      draft saved

      draft discarded


















      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









      0














      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.





      share




























        0














        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.





        share


























          0












          0








          0







          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.





          share













          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.






          share











          share


          share










          answered 47 secs ago









          filbrandenfilbranden

          8,71621241




          8,71621241

























              0














              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




              share




























                0














                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




                share


























                  0












                  0








                  0







                  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




                  share













                  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





                  share











                  share


                  share










                  answered just now









                  John1024John1024

                  47k5110125




                  47k5110125






























                      draft saved

                      draft discarded




















































                      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.




                      draft saved


                      draft discarded














                      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





















































                      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







                      Popular posts from this blog

                      Loup dans la culture

                      How to solve the problem of ntp “Unable to contact time server” from KDE?

                      ASUS Zenbook UX433/UX333 — Configure Touchpad-embedded numpad on Linux