- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个 samba 目录共享(~1500)示例:101284_2012110634 Sachine 130 AB i HeisMakeBoravia(橄榄色)
202373_2012110640 Snowchine 7 AB i 法兰德斯
300738_2012110658_Machine VP 7 AB i 重命名 v 500185
我正在编写一个脚本来解析目录并从目录名称中获取一些数据(序列号、名称、注释),并枚举一些文件,特别是列表中目录的子目录(始终相同)。我通过 ls > results.txt
生成了目录列表 我通过 parse.sh results.txt
我完成了脚本的前半部分,它从目录名称中获取我需要的数据(省略了一些行,因为它们不相关)并且它有效。我对脚本的第二部分有问题,它首先查找子目录是否存在,然后查找 file 类型的文件并获取它们的名称和 md5 哈希值。如果在自己没有空格的目录中运行,第二部分将独立工作。
#!/bin/bash
# manually set working directory /sample or /rlisti must combine with parse.sh sample.txt or results.txt
WORKING_DIR='/sample'
# read from input file which is generated from ls dir > results.txt
# usage ./parse.sh results.txt
while IFS= read line || [[ -n $line ]]; do
# some tests which find variables from $line
MACHINE_SN=$(echo "$line" | sed 's/\([0-9][0-9][0-9][0-9][0-9][0-9]\).*/\1/')
BOARD_SN=$(echo "$line" | sed 's/^[0-9][0-9]*[ _]*\([0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]\).*/\1/')
if echo $line | grep -iqF air
then
AIR='1'
else
AIR='0'
fi
# tests to find and hash particular files in sub dirs
# test if there is directory Actual_Program_and_Database in current line.
if [ -d "$WORKING_DIR"/"$line"/Actual_Program_and_Database ]
then
# if dir exists set SW_DIR to 'Actual_Program_and_Database
SW_DIR='Actual_Program_and_Database'
# count files in dir, there should be 3 or 4, good to know if there are less or more as those are exceptions
NUM_FILES=$(ls "$WORKING_DIR"/"$line"/Actual_Program_and_Database | wc -l)
DB_COUNTER=1 # count Clarion DB files in dir
# test each file - this works on it's own when run in same directory with files
# but fails if lines contain spaces
for FILENAME in "$WORKING_DIR"/"$line"/Actual_Program_and_Database/*
do
# bellow works when script is run from same directory
# FILENAME is just file without it's leading path - so I'm trying to merge it with line
FILENAME_PATH="$WORKING_DIR"/"$line"/Actual_Program_and_Database/"$FILENAME"
# files of type Clarion are DB, there is DB1 and DB2 if there is also DB3 that is exception
if file "$FILENAME" | grep -q Clarion
then
# Create variables with name DB_PATH1 DB_PATH2 etc
# eval works on it's own but breaks if paths contain spaces or ()&
eval 'DB_PATH'$DB_COUNTER="$FILENAME_PATH" # path to filename for use with md5sum
eval 'DB_NAME'$DB_COUNTER=$(basename "$FILENAME_PATH") # name of DBx file
eval 'DB_HASH'$DB_COUNTER=$(md5sum "$FILENAME_PATH" | awk '{ print $1 }') # create hash of DBx
((DB_COUNTER ++)) # increase DB counter
# files of type POSIX are SCRIPTs there should be only one
elif file "$FILENAME" | grep -q POSIX
then
SCRIPT_PATH=$FILENAME_PATH
SCRIPT_NAME=$(basename $FILENAME_PATH)
SCRIPT_HASH=$(md5sum $FILENAME_PATH | awk '{ print $1 }')
# files of type CRLF are LISTs there should be only one
elif file "$FILENAME" | grep -q CRLF
then
LIST_PATH=$FILENAME_PATH
LIST_NAME=$(basename $FILENAME_PATH)
LIST_HASH=$(md5sum $FILENAME_PATH | awk '{ print $1 }')
else
UNKNOWN_FILE='1'
fi
done
# if there isn't directory Actual_Program_and_Database in current line set dir to 0
# there are not enough exceptions to program for them
else
SW_DIR='0'
fi
# Print results (for now - will write SQL statements to populate database once script works)
echo 'serial='$SERIAL
echo 'machine sn = '$MACHINE_SN # Valmar machine SN
echo 'board sn = '$BOARD_SN # electronic board SN
echo 'NUM_FILES = '$NUM_FILES # number of files in directory
echo 'NUM_DBS = '$NUM_DBS # number of files in directory - not working
echo 'DB_COUNTER= '$DB_COUNTER
echo 'SCRIPT_NAME= '$SCRIPT_NAME
echo 'SCRIPT_HASH= '$SCRIPT_HASH
echo 'LIST_NAME= '$LIST_NAME
echo 'LIST_HASH= '$LIST_HASH
echo 'DB_NAME1= '$DB_NAME1
echo 'DB_HASH1= '$DB_HASH1
echo 'DB_NAME2= '$DB_NAME2
echo 'DB_HASH2= '$DB_HASH2
echo 'UNKNOWN_FILE='$UNKNOWN_FILE
# added sleep so I can stop script when it fails to see results
sleep 10
done < "$1"
我是否应该将 sed 添加到开始创建 LINE_ESCAPED ,这将转义行中的所有空格括号并在第二部分中使用它?或者我应该重写脚本以在共享上工作而不是在 results.txt 上工作,这甚至可以工作吗?
最佳答案
我的引用有一些错误,我正在附加路径。我之前使用eval是因为我需要db1= db2=并且我想使用eval来生成变量数字。我从 eval 切换到 array[counter],因为我避免了 eval,而 array 满足了我的需要。不了解数组 - 这是我的第一个更严肃的 bash 脚本。
我还修复了所有大写变量,并使用建议仅测试文件 $filename 一次。这是我现在可以使用的代码。谢谢大家的建议。
if [ -d "$working_dir"/"$line"/Actual_Program_and_Database ]
then
sw_dir='Actual_Program_and_Database'
num_files=$(ls "$working_dir"/"$line"/Actual_Program_and_Database | wc -l) #count files in dir
db_counter=0 # count Clarion DB files in dir
for filename in "$working_dir"/"$line"/Actual_Program_and_Database/*
do
file_type=$(file "$filename")
if [[ $file_type = *Clarion* ]]
then
db_path[$db_counter]=$filename
db_name[$db_counter]=$(basename "$filename")
db_hash[$db_counter]=$(md5sum "$filename" | awk '{ print $1 }')
((db_counter ++))
elif [[ $file_type = *POSIX* ]]
then
script_path=$filename
script_name=$(basename "$filename")
script_hash=$(md5sum "$filename" | awk '{ print $1 }')
elif [[ $file_type = *CRLF* ]]
then
list_path=$filename
list_name=$(basename "$filename")
list_hash=$(md5sum "$filename" | awk '{ print $1 }')
else
unknown_file='1'
fi
done
else
sw_dir='0'
fi
关于regex - 脚本在空格上失败,我应该编写 sed 来转义路径或更改脚本以在目录上工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51290287/
我有这个代码来查找这个模式:201409250200131738007947036000 - 1,在文本内 final String patternStr = "(\\d{
我正在尝试使用正则表达式清除一些用户输入,以删除 [ 和 ] 并删除任何大于 1 个空格的空格。但我似乎无法实现我想要的效果。这是我第一次使用正则表达式,所以我对如何写出来有点困惑。 (preg_re
我正在尝试构建这个简单的正则表达式来匹配 Java 中的单词+空格,但我在尝试解决它时感到困惑。该网站上有很多类似的示例,但答案大多给出了正则表达式本身,而没有解释它是如何构造的。 我正在寻找的是形成
好吧,我已经阅读了很多建议如何消除多余空间的帖子,但无论出于何种原因,我似乎无法将这些建议应用到我的系统中,所以我在这里寻求您的帮助。 这些是我代码的最后几行: for line in rli
所以我正在我的测试存储上学习网页抓取,但我不确定如何正确地从“sizes”数组中删除空的新行。 const $ = cheerio.load(body) $('div.lis
这个问题已经有答案了: How to prevent invalid characters from being typed into input fields (8 个回答) 已关闭 9 年前。 是
有人知道如何让扫描仪忽略空间吗?我想输入名字和第二个名字,但扫描仪不让我输入,我想保存全名 String name; System.out.print("Enter name: "); name =
这个问题在这里已经有了答案: Make Vim show ALL white spaces as a character (23 个回答) 关闭 8 年前。 VIM(使用 Solarized Dar
我想使用 StreamTokenizer 从 java 文件中提取名称。我已将空格设置为逗号 inputTokenizer.whitespaceChars(',', ','); 但是,
我正在使用此代码逐行读取 txt 文件。 // Open the file that is the first command line parameter FileInputStream fstre
我似乎无法弄清楚我需要的正则表达式。这就是我想要实现的目标: {ANY CHAR} + @javax.persistence.Column(name = "{ANY 30 CHARS}") + {AN
我正在运行 StyleCop(顺便说一句,如果你想提供高质量的代码,我完全推荐它)... 我有这条线 [System.Xml.Serialization.XmlRootAttribute(Namesp
我刚刚更新到 PhpStorm 2016,我突然注意到,每次我按 Ctrl + S 保存文件时,它都会删除我在测试这段代码后按下以继续编写的空格/制表符。 请帮忙,这对我来说很烦人,因为我在每一行代码
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 Improve th
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求提供代码的问题必须表现出对所解决问题的最低限度的了解。包括尝试的解决方案、为什么它们不起作用以及预期结果
我已经看过几十个关于这个主题的问题和答案,但我仍然无法解决我的问题。 我在我的代码中使用了一个外部 ffmpeg 转换器,我将文件路径作为参数传递,如下所示: OutputPackage oo = c
谁能详细解释一下它们是什么以及它们之间的区别。提前致谢。 最佳答案 转义序列是代表其他内容的字符序列。例如(“\n” = 新行,“\?” = 问号等)。有关更详细的列表,请检查:https://en.
我无法从我的 javascript 文本中删除换行符。这是我正在处理的数据示例: 0: "Christian Pulisic" 1: "↵" 2: "From Wikipedia, the free
我有一个问题 - 我似乎无法从字符串的开头/结尾删除新行/空格。我在正则表达式的开头和结尾使用 \s ,甚至在获取字符串后使用 .trim() ,但无济于事。 public void extractI
我是 php 的新手,我正在尝试将一系列变量添加到 html 超链接中。但是,任何返回空格的变量都会弄乱超链接。 Grants Test
我是一名优秀的程序员,十分优秀!