- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我需要实现一个脚本(duplq.sh),该脚本将使用命令行参数重命名当前目录中存在的所有文本文件。因此,如果执行命令duplq.sh pic 0 3
,它将执行以下转换:pic0.txt
必须重命名pic3.txt
pic1.txt
至pic4.txt
pic2.txt
至pic5.txt
pic3.txt
至pic6.txt
等等…
因此,第一个参数始终是文件名,第二个和第三个参数始终是正数。
我还需要确保执行脚本时,第一次重命名(将pic0.txt更改为pic3.txt)不会删除当前目录中现有的pic3.txt文件。
这是我到目前为止所做的:
#!/bin/bash
name="$1"
i="$2"
j="$3"
for file in $name*
do
echo $file
find /var/log -name 'name[$i]' | sed -e 's/$i/$j/g'
i=$(($i+1))
j=$(($j+1))
done
最佳答案
您要解决的问题实际上有些棘手,而且我认为您尚未完全解决。例如,duplq.sh pic 0 3
和duplq.sh pic 2 5
有什么区别-看起来两者都应该在数字上加3,还是第二个跳过“ pic0.txt”和“ pic1.txt”?任何一个都会对名为“ pic”,“ pic.txt”,“ picture.txt”,“ picture2.txt”,“ pic2-2.txt”或“ pic999.txt”的文件产生什么影响。
到目前为止,您在脚本中还存在许多基本错误:
您应该(几乎)始终将变量引用放在双引号中,以避免意外的单词拆分和通配符扩展。因此,例如,使用echo "$file"
代替echo $file
。在for file in $name*
中,应在变量周围加上双引号,但不要在*
旁加上双引号,因为您希望将其视为通配符。因此,正确的版本是for file in "$name"*
不要将变量引用放在单引号中,它们不会在那里被扩展。因此,在find
和sed
命令中,您没有传递变量的值,而是传递了文字后跟字母的美元符号。同样,请使用双引号。另外,在“名称”之前没有“ $”,因此即使使用双引号也不会将其视为变量。
但是find
和sed
命令不会执行您想要的任何操作。考虑find /var/log -name "name[1]"
-查找名为“ name1”而不是“ name1” +扩展名的文件。它会在当前目录和所有子目录中查找,我敢肯定您不需要。并且“ 1”("$i"
)可能不是当前文件名中的数字。假设有名为“ pic0.jpg”,“ pic0.png”和“ pic0.txt”的文件-在第一个迭代中,循环可能会找到所有三个像“ pic0 *”这样的模式,然后在第二个第三次迭代尝试查找不存在的“ pic1 *”和“ pic2 *”。另一方面,假设存在名为“ pic0.txt”,“ pic5.txt”和“ pic8.txt”的文件-再次,它可能会寻找“ pic0 *”(确定),然后寻找“ pic1 *”(未找到),然后寻找“ pic2 *”(同上)。
另外,如果使用多位数,则模式“名称[10]”将匹配“ file0”和“ file1”,但不匹配“ file10”。我不知道您为什么在这里加上括号,但是他们什么也不想做。
您已经在$file
变量中一次列出了一个文件,使用不同的条件再次搜索只会增加混乱。
另外,在脚本中,您实际上没有重命名任何内容。 find | sed
行将(如果可行)打印文件的新名称,但实际上不会重命名。
顺便说一句,当您确实使用mv
命令时,如果发生名称冲突,请使用mv -n
或mv -i
使其保持无声且不可恢复地覆盖文件。
为了防止在增加文件编号时覆盖,您需要按相反的数字顺序进行重命名(即,在将“ pic0.txt”重命名为“ pic3.txt”之前,将“ pic3.txt”重命名为“ pic6.txt”)。这特别棘手,因为如果仅按相反的字母顺序对文件名进行排序,则在“ pic10.txt”之前会得到“ pic7.txt”。但是,如果不先删除“ pic”和“ .txt”部分,就无法进行数字排序。
IMO这实际上是要使此脚本正常工作需要解决的最棘手的问题。将最大的索引号指定为参数之一,然后从那里开始并递减至0(循环遍历数字而不是文件),然后对每个数字遍历匹配的文件(例如“ pic0.jpg”),这可能是最简单的”,“ pic0.png”和“ pic0.txt”)。
关于linux - 使用命令行参数Bash更改文件名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49969730/
简而言之:我想从可变参数模板参数中提取各种选项,但不仅通过标签而且通过那些参数的索引,这些参数是未知的 标签。我喜欢 boost 中的方法(例如 heap 或 lockfree 策略),但想让它与 S
我可以对单元格中的 excel IF 语句提供一些帮助吗? 它在做什么? 对“BaselineAmount”进行了哪些评估? =IF(BaselineAmount, (Variance/Baselin
我正在使用以下方法: public async Task Save(Foo foo,out int param) { ....... MySqlParameter prmparamID
我正在使用 CodeGear RAD Studio IDE。 为了使用命令行参数测试我的应用程序,我多次使用了“运行 -> 参数”菜单中的“参数”字段。 但是每次我给它提供一个新值时,它都无法从“下拉
我已经为信用卡类编写了一些代码,粘贴在下面。我有一个接受上述变量的构造函数,并且正在研究一些方法将这些变量格式化为字符串,以便最终输出将类似于 号码:1234 5678 9012 3456 截止日期:
MySql IN 参数 - 在存储过程中使用时,VarChar IN 参数 val 是否需要单引号? 我已经像平常一样创建了经典 ASP 代码,但我没有更新该列。 我需要引用 VarChar 参数吗?
给出了下面的开始,但似乎不知道如何完成它。本质上,如果我调用 myTest([one, Two, Three], 2); 它应该返回元素 third。必须使用for循环来找到我的解决方案。 funct
将 1113355579999 作为参数传递时,该值在函数内部变为 959050335。 调用(main.c): printf("%d\n", FindCommonDigit(111335557999
这个问题在这里已经有了答案: Is Java "pass-by-reference" or "pass-by-value"? (92 个回答) 关闭9年前。 public class StackOve
我真的很困惑,当像 1 == scanf("%lg", &entry) 交换为 scanf("%lg", &entry) == 1 没有区别。我的实验书上说的是前者,而我觉得后者是可以理解的。 1 =
我正在尝试使用调用 SetupDiGetDeviceRegistryProperty 的函数使用德尔福 7。该调用来自示例函数 SetupEnumAvailableComPorts .它看起来像这样:
我需要在现有项目上实现一些事件的显示。我无法更改数据库结构。 在我的 Controller 中,我(从 ajax 请求)传递了一个时间戳,并且我需要显示之前的 8 个事件。因此,如果时间戳是(转换后)
rails 新手。按照多态关联的教程,我遇到了这个以在create 和destroy 中设置@client。 @client = Client.find(params[:client_id] || p
通过将 VM 参数设置为 -Xmx1024m,我能够通过 Eclipse 运行 Java 程序-Xms256M。现在我想通过 Windows 中的 .bat 文件运行相同的 Java 程序 (jar)
我有一个 Delphi DLL,它在被 Delphi 应用程序调用时工作并导出声明为的方法: Procedure ProduceOutput(request,inputs:widestring; va
浏览完文档和示例后,我还没有弄清楚 schema.yaml 文件中的参数到底用在哪里。 在此处使用 AWS 代码示例:https://github.com/aws-samples/aws-proton
程序参数: procedure get_user_profile ( i_attuid in ras_user.attuid%type, i_data_group in data_g
我有一个字符串作为参数传递给我的存储过程。 dim AgentString as String = " 'test1', 'test2', 'test3' " 我想在 IN 中使用该参数声明。 AND
这个问题已经有答案了: When should I use "this" in a class? (17 个回答) 已关闭 6 年前。 我运行了一些java代码,我看到了一些我不太明白的东西。为什么下
我输入 scroll(0,10,200,10);但是当它运行时,它会传递字符串“xxpos”或“yypos”,我确实在没有撇号的情况下尝试过,但它就是行不通。 scroll = function(xp
我是一名优秀的程序员,十分优秀!