Hjælp til bash script

sorenwp
Antal: 15
Tilmeldt:
25-03-2008
User is offline
Hjælp til bash script

Nogen der kan hjælpe med et lille bash script?

vil gerne den finder alle filer i mappen directory1, der efter skal den se hvilket af de filer som findes i directory2, og tilsidst de filer som findes begge steder skal slettes i directory2

Har selv prøvet, men må indse at mine linux skills ikke rekker :P
- men håber jeg er inde på noget af det rigtigt, det bare lige med at få sat det hele sammen.

find /home/user/directory1, / -type f -exec [ -f /home/user/directory2/{} ] && rm " /home/user/directory2/{}" || echo "file exists only in directory1" \;


frogmaster
frogmaster's picture
Antal: 4831
Tilmeldt:
20-05-2010
User is offline
Alt efter om du ønsker at

Alt efter om du ønsker at lære bash, finde dublerede filer/mapper eller begge ting, så kik lidt på disse link:

fslint, fdupes etc.: https://www.howtogeek.com/201140/how-to-find-and-r...

find command: http://unix.stackexchange.com/questions/122170/rem...

Det er farligt at slette filer fra bash med mindre du har backup.


mich
mich's picture
Antal: 1109
Tilmeldt:
13-10-2007
User is offline
Alt hvad du ønsker ...

Det er farligt at slette filer fra bash med mindre du har backup.
eller ved nøjagtig, hvad du gør - og det ved de færreste af os. :-(

Advanced Bash-Scripting Guide: http://www.tldp.org/LDP/abs/html/
Bash Reference Manual: http://www.faqs.org/docs/bashman/bashref.html
Bash scripting Tutorial: https://linuxconfig.org/bash-scripting-tutorial

Du kan nok finde svar på de fleste af dine spørgsmål i disse links.

Og jeg ville altid - som i *A*L*T*I*D* - prøve sådan et script på et test-dir.
Opret ~/test, ~/test/dir1, ~/test/dir2 og kopier repræsentative filer til hhv. dir1 og dir2 og afprøv dit script på dem. Det kan altid gentages, men det kan det ikke, hvis du kører scriptet på de originale directories.


sorenwp
Antal: 15
Tilmeldt:
25-03-2008
User is offline
lige nu er maskinen kun en

lige nu er maskinen kun en test maskine, så ingen ting kan blive slettet som ikke må :)


mrbrown79
Antal: 470
Tilmeldt:
12-01-2010
User is offline
Til den opgave opgave

#0:

Til den opgave opgave ville jeg droppe drømmen om en "vanvids-oneliner" og bygge et rigtigt script og en for-løkke istedet.

Eksempelvis:
--
#!/bin/bash
srcdir="./src"
chkdir="./chk"

for chkfile in `find $srcdir -type f`
do
chkfileName=`basename $chkfile`
echo "Searching for $chkfileName"
find $chkdir -name $chkfileName -ok rm {} \;
done
--

Men test det godt igennem hvis du slipper det løs på filer med mellemrum og specialkarakterer. Så skal outputs formentlig termineres noget bedre end ovenfor.

Hvis den relative sti betyder noget (og ikke kun filnavn), så brug "-path" istedet for "-name"


frogmaster
frogmaster's picture
Antal: 4831
Tilmeldt:
20-05-2010
User is offline
#0Husk at samme fil kan

#0

Husk at samme fil kan have flere navne og flere filer kan have samme navn.

Tjek om dit bash kontrollere på navn eller fil størrelse. fslint skelner så vidt jeg ved.

Et andet program der kan finde dubs er finddub fra pakken perforate, der iøvrigt er noget gammelt skidt.
sudo apt-get install perforate

For at understrege alvorligheden ved at slette filer med bash script, iht #2 og #4 's kommentarer, og iøvrigt på baggrund af #4 's glimrende script, så har jeg hurtigt brygget videre på et eksempel på hvor farligt det er.

Jeg har ikke #4 's erfaring i bash scripting ... Hvis du ønsker mere forklaring, så er det formentlig ham du skal have fat i.

#!/bin/bash

# This TEST bash check for dublicate file names.
# Remember the differences on upper- and lowercase letters in UNIX/Linux.

echo
echo -e "\033[1;31mWARNING! \033[1;96mReally? \033[1;33mYou gotta be crazy to run this script on valuable data...

Understand that this script check simultaneously file names ONLY, NOT simultaneously files and You're in danger for fucking up stuff whereever You run it...\033[0m"
echo
echo -e "\033[1;33mBefore you continue \033[1;31mbone head\033[1;33m, You'll need to change the folder names within this script, to fit the names on folders You wanna delete doublet files within, as these folder names probably not excist.

NOTE however, the wildcard \033[1;31m'*' \033[1;33mis used to \033[1;31mRECURSIVELY \033[1;33mdefine all folder and file names, including the folder that containing this script, which makes it stupidly dangerous as an eksample on what NOT to do. \033[1;31mYOU HAVE BEEN WARNED!\033[0m"
echo

# Change the directory names below. NOTE: "./" need to be infront.
srcdir="./*"
chkdir="./*"

# Back quote (referred to as an acute, grave, grave accent, left quote, open quote, or a push) [`] is used below. it's not an apostrof.
for chkfile in `find $srcdir -type f`
do
chkfileName=`basename $chkfile`
echo "Searching for $chkfileName"
echo
echo -e "Push \033[1;31my\033[0m and \033[1;31mEnter\033[0m (WARNING) to delete the file below. \033[1;31mEnter\033[0m to abort any deletings."
find $chkdir -name $chkfileName -ok rm {} \;
done
$SHELL


phoenix
Antal: 44
Tilmeldt:
23-03-2004
User is offline
finde fælles filer i to mapper

En simpel måde at finde fælles filer i to mapper er med comm

comm -12 <(ls directory1/) <(ls directory2/)

Parametren -12 fortæller at vi vil have de elementer der findes i begge filer


marlar
Antal: 3381
Tilmeldt:
05-12-2009
User is offline
Når jeg skal finde

Når jeg skal finde dubletter bruger jeg Total Commander. Det er godt nok til Windows, men fungerer fint under Wine. Især med mine mods som gør det lettere at have med Linux' filsystem at gøre.

Total Commander er verdens bedste filhåndtering. Og den har verdens bedste dubletfinder.


frogmaster
frogmaster's picture
Antal: 4831
Tilmeldt:
20-05-2010
User is offline
En simpel måde at finde

#6: En simpel måde at finde fælles filer i to mapper er med comm

Den er rigtig god, især med en lille ændring:

#!/bin/bash
# Scan for doublets
comm -12 <(ls */*) <(ls */*)
$SHELL


frogmaster
frogmaster's picture
Antal: 4831
Tilmeldt:
20-05-2010
User is offline
#0Hvis det mere handler om

#0

Hvis det mere handler om at lære bash, så prøv med noget der ikke er farligt. Der er mange eksempler på nettet der kan skubbe dig igang. Der er lavet glimrende oneliners der kan finde dubletter skrevet i andet end bash, så der er ikke grund til at genopfinde den dybe tallerken.

Et rimeligt primitivt og ufarligt eksempel, der på Ubuntu og derivater (tjekket med 14.04 og 16.04) installerer netværks scannere og tilbyder at køre dem, hvis altså bash indlæring er det primære:

#!/bin/bash
# Scan LAN Range

tput setaf 3
# tput bold
echo
echo "Scanning LAN using NMAP, NBTSCAN and ARP-SCAN"
echo
tput setaf 1
echo "You will need to manually change range within this script to work. See the internal IP below."
echo "nmap, nbtscan, arp-scan and curl are needed to be installed."

# Check hostname
tput setaf 6
echo
echo -e '\033[32m'"Hostname :" $HOSTNAME

# Check Internal IP
internalip=$(hostname -I)
echo -e '\033[32m'"Internal IP :" $internalip
tput sgr0

# Check DNS
nameservers=$(cat /etc/resolv.conf | sed '1 d' | awk '{print $2}')
echo -e '\033[32m'"Name Servers :" $nameservers
tput setaf 6
tput bold

# This only work on Ubuntu 16.04. Please uncomment according to Your need.
nmcli dev show | grep DNS | sed 's/\s\s*/\t/g' | cut -f 2
echo

# This only work om Ubuntu 14.04. Please uncomment according to Your need.
# nmcli dev list | grep DNS | sed 's/\s\s*/\t/g' | cut -f 2
tput sgr0

echo "We gonna check if nmap (zenmap), nbtscan, curl and arp-scan is installed"
echo "If they aren't, we'll attempt to install them. An internet connection is requiered."
echo

# Check if connected to Internet or not
ping -c 1 google.com &> /dev/null && echo -e '\033[32m'"Internet connected, we'll attempt to install..." || echo -e '\033[32m'"Internet not available. If the programs is installed, please continue..."

# Check if zenmap, nbtscan and arpscan is installed and install if they aren't.
tput setaf 1
sudo apt-get install zenmap && sudo apt-get install nbtscan && sudo apt-get install arp-scan && sudo apt-get install curl
echo
tput setaf 3
tput bold
read -n1 -r -p "Press any key to continue..." key
echo

# Start nmap Host up
echo -e '\E[33m'"Starting nmap HOST UP ONLY piped to awk. Please wait ..."
tput sgr0
echo

# Change the range here:
nmap -sn 192.168.137.0/24 | awk '/is up/ {print up}; {gsub (/\(|\)/,""); up = $NF}'
echo

# Start nmap latency info
tput setaf 3
tput bold
read -n1 -r -p "For latency info, press any key to continue..." key
tput sgr0
echo

# Change the range here:
nmap -T5 -sn 192.168.137.0-255
echo

# Starting nbtscan
tput setaf 3
tput bold
read -n1 -r -p "Do You wanna scan using NBTSCAN? Press any key to continue..." key
echo
echo Identifying Masterbrowser using nbtscan - MSBROWSE...
tput sgr0
echo

# Change the range here:
nbtscan -v -s : 192.168.137.0/24
echo

# Start arp-scan
tput bold
echo -e '\033[33m'"Do You wanna ARP-SCAN as root? Press any key to continue...".
echo This work without changing LAN range
read -n1 -r -p "" key
tput setaf 1
echo
sudo arp-scan -l
tput sgr0
$SHELL