根据文件名的一部分查找并复制目标目录所在的文件

根据文件名的一部分查找并复制目标目录所在的文件

我正在寻找一个 linux sh 脚本

  1. 解析文件夹以查找特定扩展名
  2. 根据文件名的一部分将所有这些文件复制到某个文件夹中。

目前我成功创建了两个命令行,

一种根据文件名的一部分创建文件夹,唯一缺少的一点是我更愿意在“Out”文件夹中而不是在当前文件夹中创建所有这些文件夹:

find -maxdepth 1 -type f \( -name "*.xxx" -o -name "*.yyy" \) \
 | tr -s '[:blank:]' '_' \
 | cut -d"-" -f1 \
 | xargs mkdir -p

第二个复制静态文件夹中找到的所有文件 Out :

find -maxdepth 1 -type f \( -name "*.xxx" -o -name "*.yyy" \) -exec cp '{}' Out \

我无法成功合并两个命令,以便根据其名称复制子文件夹中的文件(如果不存在,则创建子文件夹)

感谢帮助 !

答案1

prename在这里,使用专用的文件重命名工具(例如,mmvzsh的 )会更容易zmv。但如果你必须使用 POSIXsh和实用程序,我会这样做:

find . ! -name . -prune \( -name '*.xxx' -o -name '*.yyy' \) -type f -exec sh -c '
  ret=0
  for file do
    name=${file##*/}
    dstdir=Out/$(printf "%s\n" "${name%%-*}" | tr -s "[:space:]" "[_*]")
    mkdir -p "$dstdir" &&
      cp "$file" "$dstdir/" &&
      true > "$file" || ret=$?
  done
  exit "$ret"' sh {} +

(也避免了你的几种 GNUisms)。

答案2

我会分两次完成:

首先,像您一样创建目录...

find -maxdepth 1 -type f \( -name "*.xxx" -o -name "*.yyy" \) \
| tr -s '[:blank:]' '_' \
| cut -d"-" -f1 \
| xargs mkdir -p

第二个利用 bash 大括号扩展......

find . -maxdepth 1 -type d -not -name '.' -exec bash -c 'cp ${1}*.{xxx,yyy} ${1}/' _ {} \;

结果:

$ tree
.
├── 519_RU
│   ├── 519_RU-1801013_20181217_141826_656.xxx
│   └── 519_RU-1801013_20181217_143011_657.xxx
├── 519_RU-1801013_20181217_141826_656.xxx
├── 519_RU-1801013_20181217_143011_657.xxx
├── 825_RU
│   └── 825_RU-1809008_20190723_015635_947.yyy
├── 825_RU-1809008_20190723_015635_947.yyy
└── AB47

您可以替换in xxx yyy为生成扩展列表的命令。

答案3

感谢您的帮助,我终于找到了解决方案,基于另一个对我帮助很大的主题(这里

请在下面找到它:

find -maxdepth 1 -type f \( -name "*.xxx" -o -name "*.yyy" \) -size +0 -exec env file={} bash -c 'base="$(basename "$file" | tr -s '[:blank:]' '_' |cut -d"-" -f1)" ;dir="Out/${base%.*}";mkdir -p "$dir";cp "$file" "$dir" ; truncate "$file" -s 0 ' \;

相关内容