1. ホーム
  2. スクリプト・コラム
  3. パール
  4. アプリケーションのヒント

指定したフォルダーにあるリンク切れファイルのシンボリックリンクを自動的に削除するスクリプト

2022-01-03 04:25:54

指定したフォルダー内のリンク切れファイルのシンボリックリンクをスクリプトで自動的に解除する

指定したフォルダー内のリンク先ファイルのシンボリックリンクを消去するスクリプトです。

Linuxを使っていると、自分のファイルやプログラムの多くにシンボリックリンクを作成して、いちいち対応するフォルダに探しに行かなくても、よくアクセスする必要のあるファイルだけにシンボリックリンクを作成して、よくアクセスするファイルをデスクトップに置いたり、他のフォルダに指定したりすることがよくありますね。

これは、アクセスは簡単ですが、使用後にシンボリックリンクが多く残り、ユーザーが手動で削除可能かどうかを確認する必要があり、linuxを使う上で多くの不都合が生じます。このスクリプトを使用すると、スクリプトを実行するだけで、対応するフォルダーから未使用のシンボリックリンクを削除することができ、手が空きます。

#! /bin/bash
# A file that can test for broken symbolic links and can output the files they point to
# so that they can provide the output to xargs for processing :)
# For example. broken-link.sh /somedir /someotherdir|xargs rm
#rm
# The following method is, by all accounts, a better way:
#find
#find "somedir" -type l -print0|\
#xargs -r0 file|\
#grep "broken symbolic"|
#sed -e 's/^\|: *broken symbolic.*$/"/g'
#s
#but this is not a pure bash script, at least not yet.
# Note: Beware of using it in the /proc filesystem and any dead-loop links!
##############################################################
#If no arguments are passed to the script, then use
#current directory. Otherwise it uses the argument passed in as the directory
# to search.
####################
[ $# -eq 0 ] && directorys=`pwd` || directorys=$@

# Write the function linkchk to check if the directories or files passed in are links,
# and determine if these files or directories exist. It then prints the files to which they refer.
#If the passed-in element contains a subdirectory,
#then put the subdirectory in the linkcheck function, so that the recursive purpose is achieved.
##########
linkchk () {
  for element in $1/*; do
    [ -h "$element" -a ! -e "$element" ] && echo \"$element\"
    [ -d "$element" ] && linkchk $element
    # Of course, '-h' is used to test symbolic links, and '-d' is used to test directories.
  done
}
# Send each argument passed to the script to the linkchk function for processing,
# check for available directories. If not, then print an error message and
#usage information.
################
for directory in $directorys; do
  if [ -d $directory ]
    then linkchk $directory
    else
      echo "$directory is not a directory"
      echo "Usage: $0 dir1 dir2 ... "
  fi
  done
exit 0
# Create a new file name
andrew@andrew:/work/bash/src$ touch name
# Create a symbolic link for name
andrew@andrew:/work/bash/src$ ln -s name aaa
# Delete the name file and aaa will become a symbolic link to the missing link file
andrew@andrew:/work/bash/src$ rm name
# View aaa as a symbolic link to the name file in the current directory
andrew@andrew:/work/bash/src$ ls -l
Total usage 44
lrwxrwxrwx 1 andrew andrew 4 Feb 1 13:20 aaa -> name
-rwxrwxr-x 1 andrew andrew 8656 Jan 30 14:46 a.out
-rw-rw-r-- 1 andrew andrew 1887 Feb 1 13:08 broken_link.sh
-rw-rw-r-- 1 andrew andrew 322 Jan 29 13:08 echo_unique.sh
-rw-rw-r-- 1 andrew andrew 1513 Jan 29 15:55 escape_charater.sh
-rw-rw-r-- 1 andrew andrew 279 Jan 30 13:48 exit_example.sh
-rw-rw-r-- 1 andrew andrew 199 Feb 1 11:52 if_else_more.sh
-rw-rw-r-- 1 andrew andrew 1946 Jan 30 21:03 if_true.sh
-rw-rw-r-- 1 andrew andrew 337 Jan 29 14:02 single_quotation_mark.sh
-rw-rw-r-- 1 andrew andrew 864 Feb 1 12:00 test.c
# Call script to clear symbolic links in current folder with missing link files
andrew@andrew:/work/bash/src$ bash broken_link.sh . / | xargs rm
andrew@andrew:/work/bash/src$ ls -l
Total usage 44
-rwxrwxr-x 1 andrew andrew 8656 Jan 30 14:46 a.out
-rw-rw-r-- 1 andrew andrew 1887 Feb 1 13:08 broken_link.sh
-rw-rw-r-- 1 andrew andrew 322 Jan 29 13:08 echo_unique.sh
-rw-rw-r-- 1 andrew andrew 1513 Jan 29 15:55 escape_charater.sh
-rw-rw-r-- 1 andrew andrew 279 Jan 30 13:48 exit_example.sh
-rw-rw-r-- 1 andrew andrew 199 Feb 1 11:52 if_else_more.sh
-rw-rw-r-- 1 andrew andrew 1946 Jan 30 21:03 if_true.sh
-rw-rw-r-- 1 andrew andrew 337 Jan 29 14:02 single_quotation_mark.sh
-rw-rw-r-- 1 andrew andrew 864 Feb 1 12:00 test.c

概要

以上、スクリプトを使って、指定されたフォルダー内のリンクされていないファイルのシンボリックリンクを自動的にクリアする方法を紹介しましたが、お役に立ちましたか?