########################################################### # List files and directories which are not owned by any package in a Debian system # Scripted by Fincer (~Pekka Helenius), 2017 echo -e "\nSearch for files & folders which are not owned by any installed package.\n" if [[ $# -eq 0 ]]; then read -r -p "Folder path: " BASEDIR #Substitute $ symbol from environmental variables for printenv input if [[ $BASEDIR == *"$"* ]]; then BASEDIR=$(echo $(printenv $(echo ${BASEDIR} | sed 's/\$//g'))) fi else BASEDIR=$1 fi if [[ ! $(file --mime-type "${BASEDIR}" | grep "inode/directory" | wc -l) -eq 1 ]]; then echo "ERROR: Use full folder path as an input value!" elif [[ $# -gt 1 ]]; then echo "ERROR: Only one argument accepted!" else echo -e "Search depth:\n1 = "${BASEDIR}"\n2 = "${BASEDIR}" & subfolders\n3 = "${BASEDIR}", subfolders & 2 folder levels below\n4 = no limit\n" read -r -p "Which depth value you prefer? [Default: 1] " response case $response in 1) depth="-maxdepth 1 " depthstr="${BASEDIR}" ;; 2) depth="-maxdepth 2 " depthstr="${BASEDIR} and subfolders" ;; 3) depth="-maxdepth 3 " depthstr="${BASEDIR}, subfolders and 2 folder levels below" ;; 4) depth="" depthstr="${BASEDIR} and all subfolders" ;; *) echo -e "\nUsing default value [1]" depth="-maxdepth 1 " depthstr="${BASEDIR}" esac echo -e "\nSearching unowned files in $depthstr\n" function counter() { i=0 n=1 COUNT=$(echo "$DATASET" | wc -l) IFS=$'\n' for data in $DATASET; do echo -ne "Scanning $data_name $n ($(( 100*$n/$COUNT ))%) of all $type ($COUNT) in $depthstr\r" if [[ $(dpkg -S "${data}" &>/dev/null || echo "no path found matching pattern" | wc -l) -eq 1 ]]; then DATA_ARRAY[$i]="$(( $i + 1)) - ${data}" let i++ fi let n++ done unset IFS if [[ $i -gt 0 ]]; then echo -e "\nThe following $i of $COUNT $type is not owned by any installed package in $depthstr:\n" IFS=$'\n' echo -e "${DATA_ARRAY[*]}\n" unset IFS unset DATA_ARRAY else echo -e "\nAll $type are owned by system packages in $depthstr.\n" fi } function files() { DATASET=$(find "${BASEDIR}" ${depth} -type f) type="files" data_name="file" counter } function folders() { DATASET=$(find "${BASEDIR}" ${depth} -type d) type="folders" data_name="folder" counter } files; folders fi