Beefy Boxes and Bandwidth Generously Provided by pair Networks
Pathologically Eclectic Rubbish Lister

Re^5: s// All Files In Directory

by stevieb (Abbot)
on Apr 02, 2012 at 20:53 UTC ( #963119=note: print w/replies, xml ) Need Help??

in reply to Re^4: s// All Files In Directory
in thread s// All Files In Directory

No. You have to add the file names you want to work with after the command. In your case you want to work with all files, so append an asterisk (*). Also, add a file extension to 'i' if you want to create a backup:

perl -pi.bak -e 's/5/6/g;' *

...will create a copy of each file with a .bak extension before performing the search/replace. If you only want to affect certain files, name them explicitly, or use glob patterns. For instance, the following will only work on files with a .txt extension:

perl -pi -e 's/5/6/g;' *.txt

Replies are listed 'Best First'.
Re^6: s// All Files In Directory
by Anonymous Monk on Apr 02, 2012 at 20:58 UTC
    That depends entirely upon the shell. Bash will turn *.txt into a list of files. cmd.exe will not.
Re^6: s// All Files In Directory
by perl.j (Pilgrim) on Apr 02, 2012 at 22:54 UTC

    This doesn't seem to be working...

    Can't open *: Invalid argument.

      To tame the cmd you could use the brilliant idea which I read by BrowserUK (cannot find the link just now) - the following one-liner works on my windows pc:
      perl -pi.bak -e "BEGIN{@ARGV=map{glob}@ARGV;}s/5/6/g;" *

      A wild guess: On Windows, you used to have to use *.* to match all files, while a single * would only match files with no extension. Is that still the case?

      Aaron B.
      My Woefully Neglected Blog, where I occasionally mention Perl.

        Yes. Update:No. "*" matches all files and "*.*" the files with extension as shown below.

        With the files Text1.txt, Text2 and Test in the ordner C:/TEMP/TEMP/TEMP:

        C:\Perl\bin>perl -le "BEGIN{@ARGV=map{glob}@ARGV;}print for @ARGV" C:/ +TEMP/TEMP/TEMP/*.* C:/TEMP/TEMP/TEMP/Text1.txt C:/TEMP/TEMP/TEMP/Text2.txt C:\Perl\bin>perl -le "BEGIN{@ARGV=map{glob}@ARGV;}print for @ARGV" C:/ +TEMP/TEMP/TEMP/* C:/TEMP/TEMP/TEMP/Test C:/TEMP/TEMP/TEMP/Text1.txt C:/TEMP/TEMP/TEMP/Text2.txt
        The problem is - imho - the different behavior of globbing in the unix shell and under windows. With BEGIN{@ARGV=map{glob}@ARGV;} it can be treated.

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://963119]
and cookies bake in the oven...

How do I use this? | Other CB clients
Other Users?
Others surveying the Monastery: (6)
As of 2018-06-25 12:45 GMT
Find Nodes?
    Voting Booth?
    Should cpanminus be part of the standard Perl release?

    Results (126 votes). Check out past polls.