我文件夹中有一些文件,它们被命名为***_code_c****
(其中*
代表任何字母或数字)。我还有另一个文件夹,里面有许多文件、文件夹和子文件夹。我想要做的是查找并复制到另一个位置的任何与这些文件的名称匹配的文件,***_code_c****
但只有两个字母不同,例如和***_mode_m****
,并且***_kode_c****
任何符合此条件的文件都将被复制到特定文件夹中,其中带有 的文件mode
将被放置在一个文件夹中,而带有code
的文件将被放置在另一个文件夹中。如果有人可以告知如何做到这一点。谢谢kode
code
举例说明需要做什么:
FolderA
ABC_code_c001
里面有一些文件,比如说CDE_code_c002
,FGH_code_c003
...
另一个FolderB
里面有许多文件、文件夹和子文件夹。
对于 中的每个文件,FolderA
都有 对应的两个文件,其中FolderB
除中间部分外,名称完全相同。例如 对应的两个文件是ABC_code_c001
和ABC_kode_c001
,ABC_mode_m001
而 对应的文件FGH_code_c003
将是FGH_kode_c003
和FGH_mode_m003
等等
所以,我想要做的是获取每个文件FolderA
并搜索两个相应的文件,然后将这两个文件中的每一个复制到FolderB
另外两个文件夹中(每个文件夹中一个)。FolderC
FolderD
c
请注意,我使用的名称并不是我在示例中列出的确切名称,但它具有相同的想法,即它的名称与其他两个名称之间的差异是从到k
和的中间一个字母m
。
答案1
假设您在 $HOME 中,并且您有四个目录 -- 文件夹 A 和文件夹 B,如您的问题中所述;文件夹 K,您要将“kode”文件移动到其中;文件夹 M,您要将“mode”文件夹移动到其中。以下应该可以实现这一点:
shopt -s globstar
cd /path/to/folderA
for f in *_code_c*; do
mv /path/to/folderB/**/"${f/code/kode}" /path/to/folderK
mv /path/to/folderB/**/"${f/code_c/mode_m}" /path/to/folderM
done
显然,首先要在一些虚拟数据上进行测试。
答案2
创建一个简单的文件copyFile.sh
如下:
#!/bin/bash
kodeFile=$(basename $1 | sed -e 's/_code_c/_kode_c/')
modeFile=$(basename $1 | sed -e 's/_code_c/_mode_m/')
find FolderB -name "$modeFile" -exec cp {} FolderC/$modeFile \;
find FolderB -name "$kodeFile" -exec cp {} folderD/$kodeFile \;
保存它,例如在 /home/yourUser/bin 中。
更改权限为copyFile.sh
:
chmod +x /home/yourUser/bin/copyFile.sh
打开/home/yourUser/.bashrc
文件并在末尾添加以下行:
PATH=$PATH:/home/yourUser/bin
保存并重新加载:
source .bashrc
现在您有了一个可以搜索文件并复制它们的新实用程序。
尝试这个:
find FolderA -name "*_code_c*" -exec copyFile.sh {} \;
在 lubuntu 12.04 上测试
答案3
我相信这正是您所描述的。
下面的脚本看起来有点冗长,但其中很大一部分是用户在这个有点复杂的构造中必须提供的必要信息。
如何使用
与往常一样,复制下面的脚本,输入适当的路径(在本例中是相当多的路径)、适当的标识字符串,然后将其保存为reorg.py
。
通过命令运行:
python3 /path/to/reorg.py
剧本
#!/usr/bin/env python3
import os
import shutil
# --------------------------------------------------------
# existing files directories
original_dir = "/path/to/original_files"
equals_dir = "/path/to/files_with_name_variants"
# original identifying string
id_string = "code"
# variants + their desired destination
var_1 = "node"; vardir_1 = "/path/to/directory/where_first_variants_shouldbestored"
var_2 = "kode"; vardir_2 = "/path/to/directory/where_second_variants_shouldbestored"
# ---------------------------------------------------------
origs = []
for root, dirs, files in os.walk(original_dir):
for name in files:
if id_string in name:
origs.append(name.replace(id_string, ""))
for root, dirs, files in os.walk(equals_dir):
for name in files:
if var_1 in name:
if name.replace(var_1, "") in origs:
shutil.copyfile(root+"/"+name, vardir_1+"/"+name)
if var_2 in name:
if name.replace(var_2, "") in origs:
shutil.copyfile(root+"/"+name, vardir_2+"/"+name)