Полагаю, у меня есть решение, к счастью, мне удалось встретить гораздо более талантливого пользователя Linux, чем я, который также является соавтором -автора сценария, не буду называть имена, так как это было бы грубо по отношению к мне, но он придумал эту строку в конце "| пока читал FILENAME; делать" добавить это "[ -s "$TARGET/$FILENAME" ] || continue" не уверен, что это делает, так как я новичок, но теперь скрипт будет ждать, пока файлы не будут загружены, прежде чем перемещать их.
#!/bin/bash
# Requires inotify-tools package
#
# Authors: oddstap && yetanothergeek
#
# This simple tool takes newly created files in the Downloads directory
# and then organizes them based on file extension.
TARGET=$HOME/Downloads
inotifywait -m -e close_write -e moved_to --format "%f" "$TARGET" \
| while read FILENAME; do
[ -s "$TARGET/$FILENAME" ] || continue
EXT=${FILENAME##*.} # Extract file extension
EXT=${EXT,,} # Convert to lowercase
DEST_DIR=''
case "$EXT" in
# Word processor and text files
doc|docx|odt|pdf|rtf|tex|txt|wks|wps|wpd)
DEST_DIR="$HOME/Documents/Word_Processor_And_Text_files"
;;
# Audio files
mp3|wav|wma|mid|midi|aif|cda|mpa|ogg|wpl)
DEST_DIR="$HOME/Music"
;;
# Image files
jpg|jpeg|png|ai|bmp|gif|ico|ps|svg|tif|tiff|psd)
DEST_DIR="$HOME/Pictures"
;;
# Video files
avi|wmv|3g2|3gp|flv|h264|m4v|mkv|mov|mp4|mpg|mpeg|rm|swf|vob|wmv)
DEST_DIR="$HOME/Videos"
;;
# Compressed files
7z|arj|deb|pkg|rar|rpm|gz|z|zip)
DEST_DIR="$HOME/Documents/Compressed_Files"
;;
# Disc and media files
bin|dmg|iso|toast|vcd)
DEST_DIR="$HOME/Documents/Disk_Images"
;;
# Data and database files
csv|dat|db|dbf|log|mdb|sav|sql|tar|xml)
DEST_DIR="$HOME/Documents/Data_Database"
;;
# Executable files
apk|bat|cgi|pl|com|exe|gadget|jar|py|wsf)
DEST_DIR="$HOME/Documents/Executable_File"
;;
# Font files
fnt|fon|otf|ttf)
DEST_DIR="$HOME/Documents/Fonts"
;;
# Internet related files
asp|cer|cfm|css|htm|html|js|jsp|php|rss|xhtml)
DEST_DIR="$HOME/Documents/Internet_files"
;;
# Presentation files
key|odp|pps|ppt|pptx)
DEST_DIR="$HOME/Documents/Presentation"
;;
# Programming files
c|class|cpp|cs|h|java|sh|swift|vb)
DEST_DIR="$HOME/Documents/Programming_Files"
;;
# Spreadsheet files
ods|xlr|xls|xlsx)
DEST_DIR="$HOME/Documents/Spreadsheets"
;;
# Anything else
*)
# TODO: handle any unrecognized files here
;;
esac
if [ "$DEST_DIR" = "" ] ; then
# If we didn't find a place for this file, just skip it.
continue
fi
# Now we should have our filename and our destination directory
# So let's do it!
mkdir -p "$DEST_DIR"
chmod +w "$TARGET/$FILENAME"
if ! [ -e "$DEST_DIR/$FILENAME" ] ; then
mv "$TARGET/$FILENAME" "$DEST_DIR"
else
# Don't clobber existing files!
# If we already have a "foo.txt", try "foo.txt.1.txt",
# "foo.txt.2.txt", etc. If we can't find a unique name
# after "foo.txt.99.txt" just give up -- the user can
# deal with it later.
N=0
while [ $N -le 99 ] ; do
if ! [ -e "$DEST_DIR/$FILENAME.$N.$EXT" ] ; then
mv "$TARGET/$FILENAME" "$DEST_DIR/$FILENAME.$N.$EXT"
break # Success!
fi
N=$((N+1))
done
fi
done
Вы можете использовать команду grep
, например:
grep -v "[A-Za-z]" filename > filename.output
Вот тест:
# cat zz2
1;2
a,1
2,B
# grep -v "[A-Za-z]" zz2
1;2
Для фильтрации пустых строк вы можете использовать:
grep -v "[A-Za-z]" zz2 | grep -v '^$'
с помощью sed
и команды d
:
sed '/[a-zA-Z]/d' data
Удалить всю строку, если найден хотя бы один символ.
Сawk
:
awk '!/[a-zA-Z]/' data
Не печатать, если внутри строки находится хотя бы один символ.
$ awk '/^[0-9.,]+$/' input.csv
8.1.0,289,,,,,,,,,,,,,,,,
9,260,,,,,,,,,,,,,,,,
10,207,,,,,,,,,,,,,,,,
9,206,,,,,,,,,,,,,,,,
10,194,,,,,,,,,,,,,,,,
8.1.0,184,,,,,,,,,,,,,,,,
печатает строки, содержащие ТОЛЬКО цифры, точки и запятые. Любой другой символ, появляющийся в любом месте строки, предотвратит печать этой строки.
LC_ALL=C grep -v '[^0123456789,.]' < in.csv > out.csv
Удалит строки, содержащие любой символ, кроме 0123456789,.
. С помощью LC_ALL=C
мы гарантируем, что все последовательности байтов образуют допустимые символы. В локали C
(, но часто не в других локалях ), замена 0123456789
на 0-9
должна быть безопасной.
Для более строгого соответствия, которое требует, чтобы строки были последовательностями из 0 или более ,
разделенных полей, состоящих из.
-отдельных списков из 0 или более последовательностей из 1 или более десятичных цифр, с GNU grep
вы можете сделать:
LC_ALL=C grep -xP '((\d+(\.\d+)*)?)(,(?1))*' < in.csv > out.csv
или POSIX:
number=[0123456789]+
field="($number(\\.$number)*)?"
LC_ALL=C grep -xE "$field(,$field)*" < in.csv > out.csv
Сawk
:
$ awk '/^[0-9.,]+$/' input
Эта команда написана так, как предложил @EdMorton.
Другой метод:
$ awk 'BEGIN{FS=OFS=","}
{for(i=1;i<=NF;i++)
if ($i ~ /^(\-?[0-9.]+)([eE]\-?[0-9.]+)?$/ || $i == "");
else $0=""};
(NF)' input
Или
$ awk 'BEGIN{FS=OFS=","}
{for(i=1;i<=NF;i++)
if ($i ~ /^(\-?[0-9.]+)([eE]\-?[0-9.]+)?$/ || $i == "") ;
else next}1' input
В приведенной выше команде, если регулярное выражение не найдено, текущая входная запись($0
)устанавливается в пустую строку(""
). Далее (NF)
или {if (NF > 0) print}
будут напечатаны все не -пустые строки. Во второй команде оператор else next
запрещает любые действия с записями, в которых регулярное выражение не совпадает.