File management

Using the find command

find . -name '*httpd*'

Searches in current directory (.) and deeper for file or directory with httpd in name.

find /www -ctime -1

Searches directory www for files whose status was changed less than 24 hours ago.

find . -amin +1500

Searches current directory for files that were accessed more than 1500 minutes (or 25 hours) ago.

Excluding a directory from find

 find /home/ -path '/home/onno' -prune -o -name '*.txt' -ls
 11829831    4 -rw-------   1 ilke     ilke         1317 Oct 23 22:46 /home/ilke/.mozilla/firefox/vkuuxfit.default/cookies.txt

Searches in /home directory and beneath for .txt files, except in /home/onno directory.

The locate Command

If you already know the filename but not the file's location, use locate. Example:

# locate libMagickCore.so.1
/usr/src/ImageMagick-6.4.8-3/magick/.libs/libMagickCore.so.1.0.0
/usr/src/ImageMagick-6.4.8-3/magick/.libs/libMagickCore.so.1
/usr/local/lib/libMagickCore.so.1.0.0
/usr/local/lib/libMagickCore.so.1

Apparently, locate relies on an index (database) which you can update as follows:

updatedb &

Other Tricks

cat iptables-rules | less

Shows contents of file iptables-rules

chmod 600 iptables-rules 

Change access rights for file iptables-rules

Explanation:

4 - read

2 - write

1 - execute

user/owner - group - world

So, for the example given above, only the user/owner may read/write this file.

Copying the contents of a directory

Do man cp and man mv to check out the copy and move commands. That said, it took me a while to figure out that the wildcard for files is NOT *.* but simply * under Linux. So, copying the contents of a directory goes like this:

[root@1038 public_html]# cp -R ../dummy-3.7.0/* .

This means: copy the contents (*) of “dummy-.3.7.0 into the current (.) directory. The -R option (recursive) ensures that any subdirectories will be copied along.

Creating symbolic links

Unix / Linux supports symbolic links, which makes it a very flexible OS. Symbolic links enable you to use a subtree in another subtree without actually copying any directories. Issue this command:

ln -s target_dir symlink_name

Add the full path if necessary.

Creating short text files

Linux uses filters such as sort to filter standard input. But you can also use a very simple filter, one which does not filter at all, to view the contents of a file:

cat myfile.txt |less

What's more, you can redirect the standard input using cat to a file:

[onno@1038 onno]$ cat > data.txt
This is a test!

Use Ctrl-D to save the file and get back to the shell prompt.

If you use the > redirect symbol, any data the file may have previously contained, is overwritten. Use » to append the data to the end of the file: cat » data.txt.

Search and Replace in Text Files

Use find and sed to search and replace strings in multiple text files.

find . -name '*.txt' -exec sed -i -e 's/find/replace/g' {} \;

You can use sed for multiple replacements, too

find . -name '*.txt' -exec sed -i -e 's/find1/replace1/g' -e 's/find2/replace2/g' -e 's/find3/replace3/g' ... {} \;

Use control+D to end the input.

Info taken from this forum.

Find Pattern First

Take a look at what's going to be replaced first:

find . -exec grep "find1" '{}' \; -print

Or, simpler:

find . | xargs grep 'string' -sl

NOTE 20160414: didn't work for me anymore.

As explained here:

  • The -s is for summary and won't display warning messages such as grep: ./directory-name: Is a directory
  • The -l is for list, so we get just the filename and not all instances of the match displayed in the results.

Or, even simpler:

grep -Ril "text-to-find-here" .
  • R: Recursive
  • i: ignore case
  • l: “show the file name, not the result itself”
  • .: (the dot) start searching in the current directory

Rename Files Recursively and Replace Strings inside Files Recursively

This is a summary of the information provided earlier.

find . -iname '*valid*' -exec rename 's/valid/mentor/i' {} +
find . -name '*' -exec sed -i -e 's/valid/mentor/g' -e 's/Valid/Mentor/g' {} \;

Applying patches to files using the patch utility

Use the patch utility to apply patches, as contained within .diff files, to other files. Example:

[root@1038 public_html]# patch -p1 -i ../patches/moodle-1.6-patch.diff
patching file lib/javascript.php
patching file lang/en_utf8/moodle.php
Hunk #1 succeeded at 197 (offset 1 line).
patching file course/format/topics/format.php
patching file course/lib.php

Making backups with tar

Use the archiving and compressing utility tar to backup your files. Here's an example where we backup the contents of a webroot dir to a tar file:

tar -zcpf tekstenweb20060824.tar public_html

Explanation:

  • z: zip
  • c: create
  • p: same permissions
  • f: make a file (instead of using the standard output)

Renaming Files

Simplest:

mv background_scifi.gif background.gif

Bulk Renaming

I have found the perl program rename to be an excellent tool for this. Its basics are explained on the 'Webmaster Tips' site.

Example:

rename -n 's/\_scifi//' *

This replaces the string “scifi” with the ”” string (i.e. an empty string), for testing purposes. To do the real thing, simply omit the -n parameter (or replace it with -v to see the actual results).

Recursive Renaming

Here's another use for rename, recursively:

find . -iname '*_en.html.erb' -exec rename 's/\_en.html.erb$/\.en.html.erb/i' {} +

This means: rename all *_en.html.erb to *.en.html.erb (replace the underscore by a dot), in the current directory and all subdirectories.

See also recursive_version for more examples (replacing spaces in file names).

Recursive Copying from an FTP Site

How do you copy multiple embedded directories at once from an ftp site? Here's some advice: forums.devshed.com.

It comes down to: wget -r ftp://username:password@domain.com/the/path/to/directory

If that does not work, try this:

ncftpget -R -v -u onno -p mysecretpassword the.ftp.host ~/Downloads/destination /the/source/directory
  • -R means recursive
  • -v means verbose (show everything)

Recursive Copying TO an (S)FTP Site

lftp -c "open -u USER_NAME,PASSWORD sftp://HOST:/TARGET_DIRECTORY ; mirror -R /SOURCE_DIRECTORY"

Recursive Removal of Files

Combine find with rm to recursively delete files. To feed the results of find to rm, pipe find to xargs. This is explained on wikipedia.org.

Example:

find . -name \*~ | xargs rm

Delete all files in current directory and subdirectories which end in ~.

For files with spaces in their names:

find . -name "*.mobi" -print0 | xargs -0 rm

Another example:

find /home/onno/docs -name \*.bak | xargs rm

Delete all files in docs and subdirectories which have the file extension .bak

Alternative:

find . -name "FILE-TO-FIND"-exec rm -rf {} \;

Print Files in a Batch

If you want to print all files in a directory, use the cli command lpr.

First you have to find out what your printer is called exactly. This is especially important if you have more than one printer installed. Use the command lpstat:

lpstat -p -d
printer hp-LaserJet-1300 is idle.  enabled since Thu 28 Jul 2011 11:41:06 AM CEST
	ready to print
system default destination: hp-LaserJet-1300

To find out what options are available for your printer, use the command lpoptions and specify your printer:

lpoptions -p hp-LaserJet-1300 -l
PageSize/Media Size: *Letter Legal Executive Statement A4 C5 C6 DL COM10 Monarch
ColorModel/Color Model: *Gray Black
StpColorPrecision/Color Precision: *Normal Best
(... etc ...)

Finally, to print all pdf documents in the current directory, for instance, issue the lpr command. WARNING: you will not be asked a confirmation, your printer will get to work immediately.

lpr -P hp-LaserJet-1300 -o media=A4 *.pdf

Copy Same File to Multiple Directories

To copy the same file to multiple subdirectories with the same structure, use the find command:

cd ~/php
touch delete_me_please.txt
find ./*/public_html/backup/moodle2 -maxdepth 1 -type d -exec cp ~/php/delete_me_please.txt {}/ \;

This will copy the file delete_me_please.txt from your php directory into all subdirectories matching the path ./*/public_html/backup/moodle2.

This is very nice if you want to copy over a patched file to multiple instances of the same system, say Moodle.

And to delete your test file:

find ./*/public_html/backup/moodle2/delete_me_please.txt -maxdepth 1 -type f -exec rm {} \;

Excluding directories from tar

tar --exclude 'local/soda/.git' --exclude 'local/soda/docs' -zcpf localplugin_soda.20121031.tar.gz local/soda

Personal Tools