-
Notifications
You must be signed in to change notification settings - Fork 0
/
Linux.sh
1538 lines (1301 loc) · 45.7 KB
/
Linux.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
================================================================================
Terminal hotkeys ===============================================================
Ctrl+U # cut all before cursor
Ctrl+K # cut all after cursor
Ctrl+W # cut word before cursor
Ctrl+Y # paste
Ctrl+L # clear screen
Ctrl+S # freeze output
Ctrl+Q # unfreeze
Ctrl+C # SIGINT - interrupt current task
Ctrl+Z # SIGTSTP - pause current task
Ctrl+D # EOF, exit
================================================================================
FHS ============================================================================
/boot/ # boot loaders
vmlinuz-x.x.x-x
grub/grub.conf
/dev/ # essential devices
/proc/ # virtual filesystem providing info about processes and kernel info
/mnt/ # temporarily mounted filesystems
/media/ # mount points for removable media
/bin/ # essential command binaries available for single user mode
/sbin/ # same for root
/lib/ # libraries for /bin and /sbin
/opt/ # optional software packages
/etc/ # system-wide configs
init.d/ # init scripts and daemons
rc # do runlevel changes (run rcN.d/ scripts)
rcN.d/ # init scripts running at certain runlevel N (links to init.d/)
# 0 - shutdown
# 1 - single user mode
# 2 - multiuser, no network
# 3 - multiuser, with network
# 5 - multiuser, GUI
# 6 - reboot
crontab
cron.d/
fstab # filesystems table
hostname
hosts
network/
interfaces
resolv.conf
passwd # list of users
shadow # passwords
group # list of groups
gshadow # group passwords
sudoers
skel/ # default user's configs
apt/
sources.list
/usr/ # secondary hierarchy for readonly files (unix system resources)
bin/
sbin/
lib/
include/
local/ # tertiary hierarchy for local data specific to this host
/tmp/ # temp files (usually removed on reboot (see $TMPTIME env var))
/var/ # variable files (logs, spool files, emails, etc.)
cache/
tmp/ # temp files to be preserved between reboots
lib/ # state information, e.g. databases
mail/
lock/
run/
spool/
cron/crontabs/ # users' crontabs
log/
dmesg
kern.log
daemon.log
auth.log
messages
syslog
/root/ # root's home directory
/home/ # users' home directories
================================================================================
Package management =============================================================
dpkg # debian package manager
-i <deb_file> # install
-r <package> # remove package
--purge <package> # remove package and its dependencies
-s <package> # print package status details
--list # list all installed packages
apt-get # APT package handling utility
update # update index
upgrade # install newest versions of all packages
install <package> # install package
-f # attempt to fix broken dependencies
remove <package>
purge <package>
-y # automatic "yes" to prompts
apt-cache
show <package> # print package records
search <regex> # search package in index
================================================================================
Bash basics ====================================================================
# Bash is a dialect of Shell.
# To make file an executable bash script:
# 1. Add at first line shebang ("#!") with path to bash interpreter:
#!/bin/bash
# or:
#!/bin/bash args
# or:
#!/bin/sh # for posix shell compatible scripts
# 2. Set executable permission for file
# comment
; # statements delimeter
# 0 - success exit code.
# true (or :) is NOP command that always returns 0.
# false - command that always returns 1.
# Bash has no types. Any command is a string.
# Command and arguments separates by whitespaces.
# Command becomes meaningful because how it uses.
# Ex:
echo "-n abc" # "-n abc\n"
echo -n abc # "abc"
echo -n `abc` # command not found
\ # escape specchar. also uses to escape newline.
"some_val" # escape most of specchars in expression. Exclude "$", "`", "\".
'some_val' # escape all specchars. Exclude only "'".
$'\n\t...' # string that contains ANSI-C escape characters
================================================================================
Statements groups ==============================================================
{ <statement1>; <statement2>; ...; } # statements group
# Group interpretes as one command and returns output, so can be used
# for IO redirection.
# Ex:
{
expr1
expr2
} > dir/file
( <statement1>; <statement2>; ...; ) # statements group
# Executes in a subshell (child process). Has local scope, so vars
# will not be available in parent scope.
$( <command1>; <command2>; ...; ) # command substitution
# Executes commands in a subshell and substitutes result.
# Ex:
a=$(
echo "List of files:"
ls -l
)
echo "$a" # quoted to save whitespaces
<( <cmd1>; <cmd2>; ...; ) # process substisution
# Interprets output as file and allows its redirection.
# Ex:
while read line; do echo $line; done < <(ls -l | tail -n +2)
# print lines from command output
<command1> && <command2> # reduced logical AND by exitcode
<command1> || <command2> # OR
{<val1>,<val2>} # variants substitution
{<m>..<n>} # by range
# Command will be interpreted as command with list of arguments
# provided by {...}.
# Could not contain unescaped spaces!
# Ex:
v=2
mkdir ./d{1," $v"}
# or
mkdir ./d{1,\ $v}
# same as `mkdir ./d1 "./d 2"` or `mkdir ./d1 ./d\ 2`
(( <expr1>, <expr2>, ... )) # arithmetic expressions group
$(( <expr1>, <expr2>, ... )) # arithmetic expression substitution
# (returns result of last)
# Ex:
echo $(( a = 1 + 1, b = 6 / 2 )) # 3
echo $a # 2
================================================================================
Variables ======================================================================
# (!) Always quote variable substitution!
varname=some_value # put|set value
# Without spaces!
$varname # substitution of value
${varname} # same
${varname:-default} # value if defined and not empty, default otherwise
${#varname} # length
${varname:offset:length} # substring
${varname/pattern/str} # replace first match by str
${varname/#pattern/str} # replace if on start
${varname/%pattern/str} # replace if on end
${varname//pattern/str} # replace all matches
${varname#pattern} # delete shortest match on start
${varname##pattern} # delete longest match on start
${varname%pattern} # delete shortest match on end
${varname%%pattern} # delete longest match on end
unset varname # delete variable
================================================================================
Arrays =========================================================================
arr=() # new empty array
arr=(<val0> <val1> ...) # create and fill
arr=([<index0>]=<val0> [<index1>]=<val1> ...) # explicitly set index
declare -a arr=(<val0> ...) # declare array
declare -A arr=([<key>]=<val1> ...) # associative array
arr[<key>]=<value> # put|set value
arr+=(<value>) # append value
${arr[<key>]} # get item by index|key
${arr[@]:<n>:<m>} # slice
${#arr[@]} # get length
${arr[*]} # join values. Uses IFS as delimeter.
${!arr[*]} # join indexes|keys
${arr[@]} # iterate by values
${!arr[@]} # iterate by indexes|keys
# Ex:
files=(./*.txt) # get filenames by glob pattern
# Iterate:
for val in "${arr[@]}"; do # remember to quote!
echo "$val"
done
seq <end> # generate sequence of numbers [1; end]
seq <start> <end> # [start; end]
seq <start> <step> <end> # [start; end] with step
================================================================================
Control statements =============================================================
if <command>; then
...
elif <command>; then
...
else
...
fi
case <str> in
<pattern1>) <command1> ;;
<pattern2>|<pattern3>) <command2> ;;
...
*) <command_default> ;;
esac
while <command>; do
...
done
# Ex:
cancel= # false
n=0
# repeat every 5 seconds until cancelled:
while [ ! $cancel ] && sleep 5; do
(( n++ ))
echo "iter $n"
[ $n -ge 5 ] && cancel=true
done
# Loop accepts lines from stdin:
while IFS="" read line; do
echo $line
done < ./file.txt
until <command>; do
...
done
for <item> in <range>; do
...
done
# Ex:
for v in "one" "two" "three"; do
echo "$v"
done
for (( <init>; <check>; <step>; )); do
...
done
select <selected> in <item1> <item2> ...; do
# will ask user to select item
# uses PS3 as prompt
# selected variable will contain selected item value or ""
# REPLY will contain number of selected item (from 1)
...
break # will ask again without break
done
# Cancel loop:
break
# Cancel current iteration:
continue
================================================================================
Test command ===================================================================
[ <expr> ] # test command.
# Unix-shell-compatible (POSIX).
# <expr> can contain:
-e <path> # is exists
-s <path> # is file exists and not empty
-f <path> # is file
-d <path> # is dir
-h <path> # is symlink
-r|-w|-x <path> # is readable|writable|executable
-t <fd> # is file descriptor opened on a terminal
# e.g. [ -t 0 ] - true if it's an interactive shell
-z <str> # is string empty
-n <str> # not empty
<str1> == <str2>
<str1> != <str2>
<str1> \< <str2> # ascii sorting
<str> \> <str2>
! <expr> # NOT
<expr1> -a <expr2> # AND (not reduced)
<expr1> -o <expr2> # OR (not reduced)
\( <expr> \) # group to change precedence
<num1> -eq <num2> # is numbers are equal
<num1> -ne <num2> # not equal
<num1> -lt <num2> # less than
<num1> -le <num2> # less or equal
<num1> -gt <num2> # greater than
<num1> -ge <num2> # greater or equal
# Ex:
if [ $char == "a" ]; then ...
[[ <expr> ]] # test keyword.
# It's more powerful but available in bash, not POSIX.
# <expr> can contain (additional to test command):
<str1> == <glob_pattern> # without quotes!
<str1> != <glob_pattern>
<str1> =~ <regex_pattern> # without quotes!
<str1> < <str2> # ascii sorting
<str> > <str>
<expr1> && <expr2> # AND (reduced)
<expr1> || <expr2> # OR (reduced)
( <expr> ) # group to change precedence
================================================================================
Regex ==========================================================================
# Glob
# Glob can be used to match string or filenames.
# There spec characters:
* # any number of any chars (exclude "/" when matching filenames)
** # any dir|file and its subdirs (recursive *)
# Should be enabled by `shopt -s globstar`
? # any single char
[a-z] # single char from range
[^a-z] # inversed
# Glob pattern implicitly anchored from start to end of line.
# Ex:
ls -l ~/*.txt # list all txt files in home dir
rm -r ./* # remove all files and dirs from cwd
if [[ filename = *.png ]]; then ...
# Extended glob
# To enable it: `shopt -s extglob`
# Also supports:
?(pattern1|pattern2|...) # zero or one occurence
*(pattern1|pattern2|...) # zero or more
+(pattern1|pattern2|...) # one or more
@(pattern1|pattern2|...) # one
!(pattern1|pattern2|...) # inverse
# Ex:
ls !(*.jpg|*.gif)
# Regex in test command
# Since bash3.0 supports =~ operator for [[]] keyword.
# It matches string from left side by regex from right side and
# returns 0 (matched), 1 (not matched) or 2 (incorrect pattern syntax).
# Ex:
if [[ some =~ ([a-z]{2})([a-z]{2}) ]]; then
echo ${BASH_REMATCH[0]} # "some"
echo ${BASH_REMATCH[2]} # "me"
fi
# Basic regex (BRE dialect)
^ # beginnig of line
$ # end of line
. # any char
[a-z] # single char from range
[^a-z] # inversed
<abc> # word (space-separated sequence)
* # zero or more occurences
# Extended regex (ERE dialect)
# additionally to BRE it supports:
+ # one or more occurences
? # zero or one occurence
{n} # n occurences of previous char or group
{n,} # n or more occurences
{n,m} # from n to m [n; m] occurences
| # logical OR
() # grouping
# (!) Do not quote glob or regex.
================================================================================
Functions ======================================================================
function func_name() { # declare function
# func body
echo $1 # first argument
}
func_name # invoke
func_name <arg1> <arg2> ... # invoke with arguments
unset func_name # delete function
# Inside function are available:
$FUNCNAME
$1, $2, ... # arguments
$# # number of args
local varname=<value> # define local variable
# By default all variables defined inside function are available
# in caller's scope and can overwrite existing vars.
return <n> # return from function
# Function can return only number, it's like an exitcode.
================================================================================
Script =========================================================================
$0 # command or script name
$1, $2, ..., ${10}, ... # arguments
# Ex:
sn=`basename $0`
echo "Script name: $sn"
$# # number of arguments
$@ # all arguments as string (separated by IFS)
# Ex:
args=("$@") # args as array
IFS="," echo "${args[*]}" # print args separated by ","
shift <n> # shift arguments list to left (exclude $0)
# n = 1 by default
set <arg1> <arg2> ... # set command line arguments
getopts <format> <arg> # parse one command line argument (invoke in while
# to get all args)
# <format> - string like "a:bc:"
# ":" after key means that value required for this key
# <arg> - variable that will contain key
# to get value - OPTARG variable
# Ex:
while getopts "ad:" arg; do
case $arg in
a) a=true ;;
d)
if [ -d "$OPTARG" ]; then
dir=$OPTARG
fi ;;
esac
done
exit <code> # quit script with exitcode [0-255]. 0 means normal exit.
$? # stores exitcode returned by last command
trap '<command1>; <command2>; ...' <signal> # trap incoming signals
trap - <signal> # restore trap to default
trap # print traps list
# It can be used to perform cleanup.
# where signal:
HUP
INT
QUIT
TERM
EXIT
# Ex:
trap 'rm -f tmpfile' EXIT
trap 'exit $?' ERR # exit from script when error occured
exec <path> # run external program. Process will be replaced
source <path> # run script in the current environment (like an import)
. <path> # same
eval <cmd> ... # concat and evaluate given command, return its exit code
set -x # enable debug mode
set +x # disable debug mode
================================================================================
Environment variables ==========================================================
export <name>=<value> # export env var to child processes
env # print current environment variables
env <name>=<value>... <cmd> <arg>...
# extend current environment with passed variables and run command
# Predefined global env vars:
BASH_VERSION # string describing the version
HOSTNAME # hostname of your computer
PPID # PID of the parent process
PWD # current working directory
RANDOM # random number between 0 and 32767 (new on each expanding)
UID # ID number of the current user
COLUMNS # width of terminal in characters
LINES # height of terminal in characters
HOME # current user's home directory
PATH # colon-separated list of paths
PS1 # string that describes the format of shell prompt
TMPDIR # directory that is used to store temporary files
IFS # args separator (' \t\n' by default)
# To set env vars need to add|change it in:
# global:
/etc/environment
# login shell:
/etc/profile
~/.profile
# nonlogin shell:
/etc/bashrc
~/.bashrc
# interactive shell:
/etc/profile
~/.profile
~/.bashrc
# noninteractive shell:
/etc/bashrc
================================================================================
History ========================================================================
history <N> # print list of N last commands
!<N> # run command number N
!-<N> # -N'th command'
!<str> # last command beginning with str
!<str>:p # print instead of run
!! # last command
!$ # last word|argument of last command
!* # arguments of last command
^a^b # replace 'a' to 'b' in last command and run
# precede command by the space to prevent saving in history
Ctrl+R # start reverse-search in history
# press again to search next (older) command
Ctrl+J # stop, copy found command to input
Ctrl+C # cancel search
================================================================================
Processes ======================================================================
<some_command> & # run command in background
$! # contains PID of recently started background task
# Ex:
( sleep 10; ) & p=$! # run and save pid
kill -INT $p
wait <pid> # pause current process until specified process stop
bg <pid> # switch paused task to background and resume it
# pid - PID or %task_number
fg <pid> # switch task to foreground
jobs # list of background tasks
top # live task manager
-d <sec> # update interval (10 seconds by default)
$$ # PID of current process
ps # list processes
-A # all
u # user-oriented format
a # all with TTY, include other users
x # all without TTY
r # only running
-t <tty> # by TTY
-p <pid> # by PID
-u <user> # by user id or name
# Ex:
ps uaxf | grep "glob_to_filter"
kill <signal> <pid> # send signal to process
# where <signal>:
-1 # SIGHUP
-2 # SIGINT
-3 # SIGQUIT
-15 # SIGTERM (default)
-9 # SIGKILL
# <pid> - PID or %task_number
killall <name> # kill process by name
-s <signal>
-i # interactive
strace -p <pid> # trace process activity: syscalls and signals
sleep <n> # put current process to sleep for <n> seconds
================================================================================
IO =============================================================================
echo <value> # print line to stdout
-n # without ending newline
-e # enable escape-sequences
-E # supress escape-sequences
<cmd> <<-EOF # here document
<some content line>
...
EOF
# redirect multiline string
# Can be used to feed commands list to an interactive program.
exec N< <file> # create|replace file descriptor N
read <varname>... # read line from stdin and put to variable(s)
# uses IFS as delimeter
-p <prompt> # show prompt
-s # hide input
-r # don't allow backslash escaping
-a # split to array
-d <char> # use <char> instead of EOL
-t <sec> # timeout
-n <n> # read max <n> chars if delimeter not received before
-N <n> # read exactly <n> chars. Ignore delimeter.
-u <fd> # specify FD instead of stdin
# Ex:
exec 3< "file_to_read"
read -u 3 line
echo "first line: $line"
<target> N< <source> # input redirection
# N = 0 by default
<source> N> <target> # output redirection (rewrite, create if doesnt exists)
# N = 1 by default
<source> N>> <target> # append
# N = 1 by default
# where:
<source>, <target> # input|output (file, statements group, etc.)
N # FD number
# Ex:
cat >> file
iconv -f cp1251 -t utf8 < album_cp1251.cue > album_utf8.cue
# Predefined FDs:
0 # stdin
1 # stdout
2 # stderr
# Redirection can be filtered.
# Ex:
wrongCmd 2> "$file" # write stderr to file
cmd > "$file" 2>&1 # write both stdout and stderr to file
cmd &> "$file" # same
cmd > "$file_out" 2> "$file_err" # write stdout and stderr to different files
cmd 1>&2 # write stdout to stderr
<cmd1> | <cmd2> # pipe, conveyer. Uses for chaining - get stdout from
# first and send it to stdin of next command. Each command executes
# in a subshell.
# Ex:
cat somefile | grep "word_to_search"
cat somefile | tr abc ABC > file2
/dev/null # path to system's black hole
# It can be used e.g. to silence stdout|stderr.
# Ex:
{ command1; command2; } 2> /dev/null # errors will be suppressed
/dev/tty # current terminal. Can be used to guarantee that output will reach
# terminal although stdout redirection
sync # flush any buffered data out to disk
================================================================================
FS =============================================================================
fuser <file> # list users that are using filesystem|file
-m <mount_point>
-k # kill all found processes
-v # verbose
fdisk -l # list devices
fdisk -l <device> # list partitions
# <device> - block device, e.g. /dev/sdb
df [<mount_point>] # show fs usage
-h # human readable
lsblk # list block devices
-o <output> # comma-separated options: "name", "rm", "size", "ro",
# "type", "fstype", "mountpoint", "label", "uuid",
# "log-sec", "phy-sec", etc (optionally with + sign to append).
# default: name,maj:min,rm,size,ro,type,mountpoint
mount <partition> <mountpoint> # mount filesystem
# <partition> - e.g. /dev/sdb1
# <mountpoint> - target directory to mount
# options:
-t <type> # filesystem type: "ext4", "ntfs", "vfat", "smbfs", etc,
-o <rights> # options, "rw" (read,write), "ro" (readonly),
# "force" (for repair), "remount" (change mountpoint or rights)
--bind <dir> # create mirror
# Ex:
sudo mkdir /mnt/somemp
sudo mount /dev/sdb1 /mnt/somemp
umount <partition|mountpoint> # unmount filesystem
fdisk <device> # change partition table of this device
mkfs -t <type> <partition> # format
dd if=<source_file|device> of=<target_file|device> # copy blocks of data
bs=<block_size>
count=<blocks_number>
mlabel -i <partition> ::<label> # change FAT label
ntfslabel <partition> <label> # change NTFS label
e2label <partition> <label> # change EXT label
# Ex:
# create bootable usb
sudo -s
umount /dev/sdb1
mkfs -t vfat /dev/sdb1
dd bs=4M if=./someimage.iso of=/dev/sdb && sync
# or
# cat ./someimage.iso > /dev/sdb && sync
fdisk /dev/sdb
# then select option "a" to set boot flag
mlabel -i /dev/sdb1 ::LIVE
# Disable journaling on HFS+ to make it writable in GNU/Linux:
diskutil disableJournal /path/to/volume
================================================================================
Files ==========================================================================
chmod <value> <file> # set privileges
# where <value> can be:
ABC
# where:
# A - "u" (user,owner), "g" (group), "o" (others), "a" (all),
# "ug", "uo", etc.
# B - "+" (add permission), "=" (rewrite permission),
# "-" (remove permission)
# C - "r" (read), "w" (write), "x" (execute), "rw", "rwx", etc.
# Special flags:
# "s" - setuid|setguid (execute with owner's
# permissions)
# "t" - sticky bit (only owners can delete|rename
# files in this directory)
# e.g. `chmod ug+x file`
UGO
# where:
# U - number 0-7 - permission for owner
# G - number 0-7 - permission for group
# O - number 0-7 - permission for others
# where:
# 0 - forbidden
# 4 - read
# 5 - read and execute
# 6 - read and write
# 7 - read, write and execute
# e.g. `chmod 754 file`
# options:
-R # recursive
--reference <file> # copy privileges from another file
-v # verbose
-f # silent
chown <user>:<group> <path>
-R # recursive
# Ex:
sudo chown -R $(whoami) some/dir
pwd # print current working directory
cd <dir> # change current directory
ls <dir|file>... # print list of items in directory or
# info about file
-a # show hidden (beginning with '.')
-A # without ./ and ../
-l # with info (chmod, size, mtime)
-F # show "/" after dir, "*" after executable file
-h # human-readable size (kb, mb, gb)
-t # sort by modified time (desc)
-S # sort by size
-r # reverse order
-s # show blocks number
-d # directory itself instead of its content
du <dir|file> # print size of file or directory recursively (disk usage)
-d <n> # max depth
-c # show grand total
-h # human readable
-s # print only total for each argument
dd # copy and convert bytes
bs=<c> # read|write up to <c> bytes at a time (e.g. "1M")
if=<source> # input file or device
of=<dest> # input file or device
cp <source>... <target> # copy file|dir
-r # recursive - to copy directory
-i # interactive mode (prompt before overwrite)
-u # update mode (only newer or non-existing)
-P # dont follow symbolic links in source
-L # always follow symlinks in source
--preserve=<attrs> # preserve attributes
# available params: mode, ownership, timestamps, context,
# links, xattr, all
-p # same as --preserve=mode,ownership,timestamps
-a # preserve all attributes
-v # verbose
mv <source>... <target> # move file|dir
-v # verbose
-i # interactive mode
-u # update mode
touch <file> # create empty file
-c # do not create if doesnt exists
-a # only update access time
-m # only update modified time
-d <rel_date> # change modified time
mkdir <dir> # create empty dir
-r # recursive
-v # verbose
rm <file> # remove file|dir
-r # recursive - to remove dir
-f # force - without prompt for subdirs
-v # verbose
ln <file_target> <link_path> # create link (hard by default)
-s # symbolic
-v # verbose
file <filename> # identify file type
locate <file> # quick file search
-i # ignore case
-b # match only basename
-c # print only count of found
--regex # use extended regex
find <dir> <search> <action> # recursively search files|dirs in
# <dir> by <search> pattern and perform <action> for each item
# where <dir> is a path
# where <search> can contain:
\( <expr> \) # group expressions to change precedence
! <expr> # NOT
<expr> -o <expr> # OR
<expt> -a <expr> # AND
-name "<glob_pattern>" # search by filename
-path "<glob_pattern>" # search by path or filename
-mtime <n> # by date modified (days)
# where <n>:
<N> # <N> days
+<N> # more than <N>
-<N> # less than
-type <type> # by type
# where <type>:
f # file
d # directory
c # character device
b # block device
l # symbolic link
-size <size> # by size (blocks)
# where <size>:
<N> # <N> blocks
<N>c # <N> bytes
<N>b # blocks
<N>w # 2-byte words
<N>k # kilobytes
<N>M # megabytes
<N>G # gigabytes
+<N>|+<N>c # more than
-<N>|-<N>c # less than
-user <username>
-perm <mode>
# and where <action>:
-print # simple print found list (default)
-delete
-exec <command> "{}" \; # execute command(s) for each found file.
# {} is a placeholder for found file path
-exec <command> "{}" + # execute once and use results as
# arguments list
-quit # stop execution on first match
# Ex:
find ./* -exec touch -m {} \; # update modified time recursively
md5sum [<file>] # md5 hash of file|input
shed [<file>] # hex editor
-r # readonly
-s <n> # cursor offset
tar <file>... # tar archiving
-f <file> # archive file
-C <file> # destination
-x # extract
-c # create
-r # append files
-u # update mode. Append files if they are newer
-t # list contents
-z # use gzip compression
-j # use bzip2 compression
# Ex:
tar -xz -f ./archive.tar.gz -C ./target
tar -xj -f ./archive.tar.bz2 -C ./target
tar -xJ -f ./archive.tar.xz -C ./target
tar -cz -f "../${PWD##*/}.tar.gz" .
zip <archive_file> <file>... # zip archiving
-d <file>... # delete files from archive
-r # recursively
-u # update mode
-e # encrypt
# Ex:
zip -r ./archive.zip ./file1 ./file2 ./dir
unzip <archive>
-d <path> # specify target dir
dump -<n> <fs> # backup filesystem, <n> - backup level (0 - full)
-u # save date and level in /etc/dumpdates
-f <dumpfile>
-a # auto-size, fill dest device
restore # restore|view dump
-f <dumpfile>
-x <filename> # restore specified file
-r # restore to cwd
-i # interactive restore
# commands:
# cd, ls, pwd, add <filename>, extract
================================================================================
Text processing ================================================================
less [<file>] # view file|input with pagination
-N # show line numbers
-M # show prompt (number of lines, percent, filename)
head [<file>] # print first part of file|input
-n <lines> # number of lines to print
-c <bytes> # bytes to print
tail [<file>] # print last part
-n <lines>
-c <bytes>
-f # watch for updates
grep <pattern> [<file>...] # search by pattern in contents of each
# file or stdin
-r # resursive
-G # use basic regular expression (BRE) (default)
-E # use extended regular expression (ERE)
-P # use perl regex
-F # fixed string, dont interpret pattern as regex
-m <n> # specify max count of matches
-v # invert match
-i # ignore case
-w # match whole words
-x # match whole lines
-C <n> # show <n> lines around (context)
-H # show filenames
-h # dont show filenames
-n # show line numbers
-l # print only filenames
-L # print only filenames of not matched
-c # print only count of matched lines per file
-q # supress output (return only exit code)
-s # supress warnings
# Ex:
ls -a | grep ".bash*"