执行 cp 从 Bash 脚本中排除文件

执行 cp 从 Bash 脚本中排除文件

我目前正在编写一个 bash 脚本来自动执行我的研究任务,即程序化地创建将发送到集群的多个脚本。

我的 bash 脚本由一个复制操作组成,它将复制所有文件到某个文件夹,其名称由某个过程生成,但不包括这个文件。我知道如何手动执行此操作,但在 bash 脚本中它似乎不起作用:

#!bin/sh

i=0
var=""

while [ $i -lt 6 ]
do
   i=$(( $i+1 ))
   
   var="NameOfFolder${i}"
   mkdir "${var}"
   cp !(fileName) "${var}"
done

我遇到的问题是cp命令中的括号的解释不同。

我收到的错误是:

Syntax error: "(" unexpected (expecting "done")

当我删除给出命令的行时,cp脚本运行,因此问题就出在那一行。我已经尝试过了:

#!bin/sh

i=0
var=""

while [ $i -lt 6 ]
do
   i=$(( $i+1 ))
   
   var="NameOfFolder${i}"
   mkdir "${var}"
   cp !((fileName)) "${var}"
done

#!bin/sh

i=0
var=""

while [ $i -lt 6 ]
do
   i=$(( $i+1 ))
   
   var="NameOfFolder${i}"
   mkdir "${var}"
   cp ( !(fileName) ) "${var}"
done

没有任何成功。

问题

在括号中引入命令的正确方法是什么,而不让 Bash 脚本将它们解释为“编程”运算符?

答案1

您可以使用括号扩展创建一系列文件夹(您还需要排除文件夹本身)

#!/bin/bash

shopt -s extglob

for i in folder_{1..6}; do
    mkdir -p "$i" && \
    cp -t "$i" -- !(filename|${i%_*}_*)
done

答案2

您可以使用rsync作为构造的替代cp:例如

cp ( !(fileName) ) "${var}"

rsync --exclude="$fileName" * "./${var}"

--exclude选项rsync使得事情变得易于管理。

答案3

您好,欢迎来到 Askubuntu!

尝试这个:

在哪里:

  1. find- 一种(来自 man)“在目录层次结构中搜索文件”的工具
  2. .是您要包含的文件夹/目录(将搜索此目录下的所有子目录和子文件)
  3. -name *.ext- 这是扩展名(文件以 .name 结尾)
  4. -type f是一种类型文件。
  5. -exec strings {} path/to/this/copiedfiles \;- 这个正在执行命令cpfile 1... file 1,全部到last file foundpath/to/this/copiedfiles

例如:

复制文件夹 /home/bob/docs/ 中所有以“.odt”结尾的文件(包括以下子目录中的所有子文件)文档/)到目录/home/bob/backups/odt/:

find /home/bob/docs/ -name "*.odt" -type f -exec cp {} /home/bob/backups/odt/{}.backup \;

相关内容