文件操作 - install-sh
返回文件管理
返回主菜单
删除本文件
文件: /usr/libexec/pcp/bin/install-sh
编辑文件内容
#!/bin/sh # # Copyright (c) 2013 Red Hat. # Copyright (c) 2004 Silicon Graphics, Inc. All Rights Reserved. # # This program is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by the # Free Software Foundation; either version 2 of the License, or (at your # option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY # or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License # for more details. # # This script emulates bsd install and also recognises # two environment variables, with the following semantics :- # # $DIST_MANIFEST - if set, the name of the file to append manifest # information in the following format: # File : f mode owner group src target # Diretory: d mode owner group target # Symlink : l linkval target # # $DIST_ROOT - if set, prepend to target # # The sematics of all combinations of these two variables # are as follows: # # $DIST_MANIFEST? $DIST_ROOT? | Copy? Append Manifest? # -----------------------------+-------------------------- # not set not set | yes no # not set set | yes no # set not set | no yes # set set | yes yes _usage() { echo "Usage: $prog [-o owner] [-g group] [-m mode] -d directory" echo "or $prog [-o owner] [-g group] [-m mode] file directory/file" echo "or $prog [-o owner] [-g group] [-m mode] file file [file ...] directory" echo "or $prog -S file target (creates \"target\" symlink)" echo "" echo "The \$DIST_MANIFEST and \$DIST_ROOT environment variables affect the" echo "behaviour of this command - see comments in the script." echo "" exit 1 } _chown() { _st=255 if [ $# -eq 3 ] ; then chown "$1:$2" "$3" _st=$? if [ $_st -ne 0 ] ; then if [ $REAL_UID != '0' ] ; then if [ ! -f "$DIST_ROOT"/.chown.quiet ] ; then echo '===============================================' echo Ownership of files under ${DIST_ROOT:-/} echo cannot be changed echo '===============================================' if [ -n "$DIST_ROOT" ] ; then touch "$DIST_ROOT"/.chown.quiet fi fi _st=0 fi fi fi return $_st } _ln() { if uname -s | tr 'A-Z' 'a-z' | grep mingw >/dev/null then /bin/true else ln -s -f "$1" "$2" fi } _manifest() { echo $* | sed -e 's/\/\//\//g' >>${DIST_MANIFEST:-/dev/null} } ID=id # Test to use the functional id on Solaris test -f /usr/xpg4/bin/id && ID=/usr/xpg4/bin/id prog=`basename $0` HERE=`pwd` dflag=false Sflag=false DIRMODE=755 FILEMODE=644 OWNER=`$ID -u 2>/dev/null` GROUP=`$ID -g 2>/dev/null` if [ -z "$OWNER" -o -z "$GROUP" ] then # do it the hardway # OWNER=`$ID | sed -e 's/.*uid=[^(]*(//' -e 's/).*//'` GROUP=`$ID | sed -e 's/.*gid=[^(]*(//' -e 's/).*//'` fi REAL_UID=$OWNER # default is to install and don't append manifest INSTALL=true MANIFEST=: [ -n "$DIST_MANIFEST" -a -z "$DIST_ROOT" ] && INSTALL=false [ -n "$DIST_MANIFEST" ] && MANIFEST="_manifest" [ $# -eq 0 ] && _usage if $INSTALL then RM=rm; CP=cp; LN=_ln; MKDIR=mkdir; CHMOD=chmod; CHOWN=_chown else RM=true; CP=true; LN=true; MKDIR=true; CHMOD=true; CHOWN=true fi test $REAL_UID -ne 0 && CHOWN=true test "$NO_CHOWN" = "true" && CHOWN=true while getopts "d:g:m:o:S:" c do case $c in d) dir=`echo "$DIST_ROOT/$OPTARG" | sed -e 's;//*;/;g'` dflag=true ;; g) GROUP=$OPTARG ;; m) DIRMODE=`expr $OPTARG` FILEMODE=$DIRMODE ;; o) OWNER=$OPTARG ;; S) symlink=$OPTARG Sflag=true ;; *) _usage ;; esac done shift `expr $OPTIND - 1` status=0 if $dflag then # # first usage # $MKDIR -p "$dir" status=$? if [ $status -eq 0 ] then $CHMOD $DIRMODE "$dir" status=$? fi if [ $status -eq 0 ] then $CHOWN $OWNER $GROUP "$dir" status=$? fi $MANIFEST d $DIRMODE $OWNER $GROUP `echo "$dir" | sed -e "s;^$DIST_ROOT;;"` elif $Sflag then # # fourth usage (symlink) # if [ $# -ne 1 ] then _usage else target=`echo "$DIST_ROOT/$1" | sed -e 's;//*;/;g'` fi $RM -f "$target" dir=`dirname "$target" | sed -e 's;//*;/;g'` [ ! -d "$dir" ] && mkdir -p "$dir" $LN "$symlink" "$target" status=$? $MANIFEST l "$symlink" `echo "$target" | sed -e "s;^$DIST_ROOT;;"` else list="" dir="" if [ $# -eq 2 ] then # # second usage: install file dir/name # target 'name' is not necessarily the same as 'file' # (Note: install file dir is ambiguous and not supported # f="$1" dir="$DIST_ROOT"/`dirname "$2"` dir=`echo "$dir" | sed -e 's;//*;/;g'` t_dir=`echo "$dir" | sed -e "s;^$DIST_ROOT;;" | sed -e 's;//*;/;g'` destfile=`basename "$2"` if [ -f "$f" -a -f "$f.exe" ] then # Windows hack -- executables present as foo and foo.exe, # the foo one is visible to test(1) and ls(1), but not to # cat(1)/cp(1) ... need to $RM/$CP the foo.exe one # if cat "$f" >/dev/null 2>&1 then : else f="$f.exe" destfile="$destfile.exe" fi fi [ ! -d "$dir" ] && mkdir -p "$dir" if [ -d "$dir/$destfile" ] then echo ERROR: unsupported install usage _usage exit 1 else $RM -f "$dir/$destfile" fi $CP "$f" "$dir/$destfile" status=$? if [ $status -eq 0 ] then [ ! -d "$dir/$destfile" ] && $CHMOD $FILEMODE "$dir/$destfile" status=$? if [ $status -eq 0 ] then $CHOWN $OWNER $GROUP "$dir/$destfile" status=$? fi $MANIFEST f $FILEMODE $OWNER $GROUP "$HERE/$f" "$t_dir/$destfile" fi [ $status -ne 0 ] && break else # # third usage: install file file [file ...] directory # n=1 while [ $# -gt 0 ] do if [ $# -gt 1 ] then list="$list $1" else dir=`echo "$DIST_ROOT/$1" | sed -e 's;//*;/;g'` fi shift done # At this stage, $list is the list of files to install # in $dir. We create $dir if necessary # t_dir is for the manifest, i.e. without $DIST_ROOT prefix t_dir=`echo "$dir" | sed -e "s;^$DIST_ROOT;;"` for f in $list do if [ -f "$f" -a -f "$f.exe" ] then # Windows hack -- executables present as foo and foo.exe, # the foo one is visible to test(1) and ls(1), but not to # cat(1)/cp(1) ... need to $RM/$CP the foo.exe one # if cat "$f" >/dev/null 2>&1 then : else f="$f.exe" fi fi [ ! -d "$dir" ] && mkdir -p "$dir" $RM -f "$dir/$f" $CP "$f" "$dir/$f" status=$? if [ $status -eq 0 ] then $CHMOD $FILEMODE "$dir/$f" status=$? if [ $status -eq 0 ] then $CHOWN $OWNER $GROUP "$dir/$f" status=$? fi $MANIFEST f $FILEMODE $OWNER $GROUP "$HERE/$f" "$t_dir/$f" fi [ $status -ne 0 ] && break done fi fi exit $status
修改文件时间
将文件时间修改为当前时间的前一年
删除文件