我正在寻找一个 linux sh 脚本
- 解析文件夹以查找特定扩展名
- 根据文件名的一部分将所有这些文件复制到某个文件夹中。
目前我成功创建了两个命令行,
一种根据文件名的一部分创建文件夹,唯一缺少的一点是我更愿意在“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
在这里,使用专用的文件重命名工具(例如,mmv
或zsh
的 )会更容易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 ' \;