I am trying to find and replace text inside several .sas files using find -exec along with sed, but I would like to direct the output to new .sas files named according to the result of the find command (if that makes sense to anyone). Something like this: find . -type f -name &quot;*.sas&quot; -exec sed 's/2020/2021/g' {} &gt; {}_new \; I'm new to Unix, and I've googled this question but couldn't find anything that specifically addressed the issue of naming the new output .sas file using the find command result of {} as a prefix.
12595
I'm using find with the -exec option in console, on FreeBSD (for example, find . -exec sha1 {} \;).   How do I correctly place (and if needed, escape) redirect and other execution control symbols that could syntactically apply to either of the exec command or the find command, such as > >> | and &amp;, where I might want the symbol to apply to the find or the exec commands on different occasions?  On the same theme, what is the syntax if I want to use tee to view the output of the -exec commands on the console (to watch progress) and also appended to a file (for later use)?   (I know shells vary but hopefully the most used shells such as sh/csh are quite similar?)  Update:  In part, I want to learn if nested find -exec can be done without scripting, as a simple command. Here is the use-case that prompted the questio :   outer find: find all subdirs matching DIR_MATCH_TEXT in DIR1  inner find: for each matching subdir found in the outer loop (call it DIR2), execute the commandfind DIR2 -name "FILE_MATCH_TEXT" -exec sha1 {} \; &gt;&gt; DIR1/DIR2_hashes.txt   The aim being to create a set of files, one for each matching subdir, containing the output of some find -exec action on that subdir.  By this I mean that, if /backups contains /jan2017 and /feb2017, the result will be two files at /backups/jan2017_hashes.txt and /backups/feb2017_hashes.txt, with jan2017_hashes.txt containing the output from sha1 for (say) all .pdf files in /backups/jan2017, and feb2017_hashes.txt containing the output from sha1 for all .pdf files in /backups/feb2017.  From replies so far I gather the outer find would have to use a shell call as the argument to -exec?
72476
My current best bet is:  for i in $(find . -name *.jpg); do echo $i; done   Problem: does not handle spaces in filenames.   Note: I would also love a graphical way of doing this, such as the "tree" command.
4911
I started learning linux on vmware using centos 7. I created an image directory and several layers of files and sub-directories in that folder. most of the names containing spaces. I want to use a single command to rename all the files and directories at once.   command i am using right now is  find . -type f -exec rename "find" "replace" {} \; &amp; find . -type d -exec rename "find" "replace" {} \; Where as find is a space and replace is "-"(hiphen). I even tried below command looking at one of the answer in stack exchange.  find . -iname "find" -exec rename "find" "replace" {} \;
109072
This is more a conceptual thing than a current problem.  Would it be possible to do this:  tail -f &lt;file&gt; | grep "string" | sed 's/stuff//g' &gt;&gt; output.txt  The problem I'm thinking is that tail -f never terminates so it won't progress in the command. I'm trying to read and output a file in real-time. If this doesn't work how would I do it?
9247
I'm trying to use find to echo 0 into some files, but apparently this only works with sh -c:  find /proc/sys/net/ipv6 -name accept_ra -exec sh -c 'echo 0 &gt; {}' \;   But using sh -c with find -exec makes me feel very uneasy because I suspect quoting problems. I fiddled a bit with it and apparently my suspicions were justified:   My test setup:  martin@dogmeat ~ % cd findtest  martin@dogmeat ~/findtest % echo one &gt; file\ with\ spaces martin@dogmeat ~/findtest % echo two &gt; file\ with\ \'single\ quotes\' martin@dogmeat ~/findtest % echo three &gt; file\ with\ \"double\ quotes\" martin@dogmeat ~/findtest % ll insgesamt 12K -rw-rw-r-- 1 martin martin 6 Sep 17 12:01 file with "double quotes" -rw-rw-r-- 1 martin martin 4 Sep 17 12:01 file with 'single quotes' -rw-rw-r-- 1 martin martin 4 Sep 17 12:01 file with spaces  Using find -exec without sh -c seems to work without problems - no quoting necessary here:  martin@dogmeat ~ % find findtest -type f -exec cat {} \; one two three  But when I'm using sh -c {} seems to require some kind of quoting:  martin@dogmeat ~ % LANG=C find findtest -type f -exec sh -c 'cat {}' \; cat: findtest/file: No such file or directory cat: with: No such file or directory cat: spaces: No such file or directory cat: findtest/file: No such file or directory cat: with: No such file or directory cat: single quotes: No such file or directory cat: findtest/file: No such file or directory cat: with: No such file or directory cat: double quotes: No such file or directory  Double quotes work as long as no file name contains double quotes:  martin@dogmeat ~ % LANG=C find findtest -type f -exec sh -c 'cat "{}"' \; one two cat: findtest/file with double: No such file or directory cat: quotes: No such file or directory  Single quotes work as long as no file name contains single quotes:  martin@dogmeat ~ % LANG=C find findtest -type f -exec sh -c "cat '{}'" \; one cat: findtest/file with single: No such file or directory cat: quotes: No such file or directory three    I haven't found a solution that works in all cases. Is there something I'm overlooking, or is using sh -c in find -exec inherently unsafe?
75442
I have a directories with .MP3 files which I'd like to change the extensions to .mp3. What's the easiest way to do this? I'm think something along the lines of:  find /RootPath -type f -iname "*.mp3" -exec mv {} sed s/.*MP3/\1.mp3/ \;    ...though I know that isn't quite right. :) The substitution isn't correct and I'm not sure how to use both a mv and a sed command with -exec in find.  Would I need a bash script for this?
91376
Is this possible? I read somewhere that the following command would do it:     sed -e [command] [file]   but it appeared to do the same thing as just     sed [command] [file]   (it did not save the changes). Is there any way to do this using sed?
59964
I can't for the life of me figure out how find with the test -name works.  I run find / -name *in and returns a bunch of results:  /sbin /sbin/sulogin /dev/stdin   to name a few.  It's as if it performed filename expansion, but that happens before the shell runs the command, so that can't be it. Also because I don't have any files in the current directory that match *in. Plus, single quoting *in yields the same results, which further supports that this can't be filename expansion.  The documentation leads me to believe that find with -name uses regular expressions, but the regex pattern *in doesn't match the results I showed above.  Can someone enlighten me?
84698
I'm looking to write a script that will find and replace any characters other than [^A-Za-z0-9._-] in a specific file type (in this case .avi) with an underscore _. I want this to exec recursively from the current path. I'm using Ubuntu.  I do not want or need to change any folder names as I have control over those at the time of creation. Here's what I have now after referencing the following link:    find . -depth -exec rename 's!([^/]*\Z)/[^A-Za-z0-9._-]/_/g' *.avi {} +   I'm clearly missing something. Please help. :)
26804
I'm so confused with GNU sed, POSIX sed, and BSD sed's myriad of options.  How do I replace literal \n with the newline character using these three sed types?
112882
Something like the following is what I what I'm after,  but my code doesn't work, no matter how I escape {} and + ;     find ./ -maxdepth 1 -type d -name '.*' -exec \     find {} -maxdepth 1 -type f -name '*.ini' -exec \         md5sum \{\} \\; \;   After seeing this ,  I found that the following code works, but it isn't nesting find as such, and I suspect there is a better way to do this particular job.       find ./ -maxdepth 1 -type d -name '.*' \ -exec bash -c 'for x; do     find "$x" -maxdepth 1 -type f -name "*.ini" \     -exec md5sum \{\} \;; \ done' _ {} \+   Is there some way to nest find -exec without the need to invoke  a shell (as above), with all its whacky quoteing and escape constraints?    Or can this be done directly in a single find command,  using a blend of its many parameters?
28017
I'm using this command to rename files:  for fname in *; do     mv "$fname" $(echo "$fname" | sha1sum | cut -f1 -d' ') done   But it only renames in the current directory. Let's say I have many directories, and each directory contains some other directories, and last directory tree contains files. I want to rename them with random characters.  I think find . -type f should work, and have tried it, but still did not get any working command.
96079
I am using the following code to read specific lines in an ASCII file "text.dat"  sed -n '/Columnaxis/p' text.dat   The output is   Columnaxis: 100   In order to output only the second part previous line, I added the following to the previous command line:   sed -n '/Columnaxis/p' text.dat | awk '{ print $2 }'   The output of the last command is "100"  How can I update the last code to output negative numbers, regardless of the number's original sign? ( i.e if the input is "+100" I want the code to output "-100" also if the input is "-100", I want the code to output "-100"  PS. The content of text.dat is something like the following :  Columnaxis: 100 Columnaxis_1: 100 Columnaxis_2: -100 Columnaxis_3: 50 Columnaxis_4: -2.3 Columnaxis_5: 1.2 Columnaxis_6: -5 Columnaxis_7: -2 Columnaxis_8: -4 Columnaxis_9: -2   I want the code to output the following:  Columnaxis: -100   Let's say that the input has "Columnaxis: +100", then I want it to be  Columnaxis: -100
4793
I want to do:  cat update_via_sed.sh | sed 's/old_name/new_name/' &gt; new_update_via_sed.sh   in my program.  But I want to use variables, e.g.  old_run='old_name_952' new_run='old_name_953'   I have tried using them but the substitution doesn't happen (no error). I have tried:  cat update_via_sed.sh | sed 's/old_run/new_run/' cat update_via_sed.sh | sed 's/$old_run/$new_run/' cat update_via_sed.sh | sed 's/${old_run}/${new_run}/'
105512
I can't find any documentation about the sed -e switch, for simple replace, do I need it?  e.g.  sed 's/foo/bar/'   VS  sed -e 's/foo/bar/'
115700
I have a directory, dir1 which contains many files whose names end in either .jpg or .png. I want to copy all the .png files to dir2 which is empty.  This command works:  find dir1 -name '*.png' -exec cp {} dir2 \;   but this command doesn't:  find dir1 -name '*.png' -exec cp {} dir2 + find: missing argument to `-exec'   I also tried:  find dir1 -name '*.png' -exec cp {} -t dir2 + find: missing argument to `-exec'   and:  find dir1 -name '*.png' -exec cp {} dir2 \+ find: missing argument to `-exec'   After looking at , I even tried:  find dir1 -name '*.png' -exec cp {} dir2 {} + find: Only one instance of {} is supported with -exec ... +    says that:     -exec {} + was added in [version] 4.2.12 in 2005   My version of find is 4.4.2.  What am I doing wrong?
50121
The man page for GNU find states:    -exec command ;     [...] The  string `{}'  is  replaced  by the current      file name being processed everywhere it occurs in the      arguments to the command, not just in arguments where      it is alone, as in some  versions  of  find.     Both  of  these  constructions might need to be escaped      (with a `\') or quoted to protect them from expansion      by the shell.     That's from the man to find (GNU findutils) 4.4.2.   Now I tested this with bash and dash, and both don't need to have the {} being masked. Here is a simple test:  find /etc -name "hosts" -exec md5sum {} \;    Is there a shell, for which I really need to mask the braces? Note, that it doesn't depend upon whether the file found contains a blank (invoked from bash):   find ~ -maxdepth 1 -type d -name "U*" -exec ls -d {} \;  /home/stefan/Ubuntu One   This changes if the found file is passed to a subshell:  find ~ -maxdepth 3 -type d -name "U*" -exec bash -c 'ls -d {}' \;  ls: cannot access /home/stefan/Ubuntu: No such file or directory ls: cannot access One: No such file or directory   which can be solved by:  find ~ -maxdepth 3 -type d -name "U*" -exec bash -c 'ls -d "$0"' {} \;   in contrast to:   find ~ -maxdepth 3 -type d -name "U*" -exec bash -c 'ls -d "{}"' \;  /home/stefan/Ubuntu One   but that's not what the man page is talking about, is it? So which shell treats {} in a different way?