Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux将文件递归复制到其父文件夹_Linux_Bash - Fatal编程技术网

Linux将文件递归复制到其父文件夹

Linux将文件递归复制到其父文件夹,linux,bash,Linux,Bash,我想将文件以递归方式复制到其父文件夹中,以获得特定的文件扩展名。例如: ./folderA/folder1/*.txt to ./folderA/*.txt ./folderB/folder2/*.txt to ./folderB/*.txt 等等 我检查了cp并找到了命令,但无法使其工作 $cp ./folderA/folder1/*.txt ./folderA 试试这个命令 尝试此命令,从rootish目录运行类似以下命令: #! /bin/bash BASE_DIR=./ new

我想将文件以递归方式复制到其父文件夹中,以获得特定的文件扩展名。例如:

./folderA/folder1/*.txt to ./folderA/*.txt  
./folderB/folder2/*.txt to ./folderB/*.txt
等等

我检查了cp并找到了命令,但无法使其工作

$cp ./folderA/folder1/*.txt ./folderA
试试这个命令


尝试此命令,从rootish目录运行类似以下命令:

#! /bin/bash
BASE_DIR=./

new_dir() {
LOC_DIR=`pwd`
for i in "${LOC_DIR}"/*; do
    [[ -f "${i}" ]] && cp "${i}" ../
    [[ -d "${i}" ]] && cd "${i}" && new_dir
cd ..
done
return 0
}

new_dir
这将搜索每个目录。当遇到一个文件时,它会将该文件复制到一个目录中。当找到一个目录时,它将向下移动到该目录中,并重新启动该过程。我想这对你有用


祝你好运。

从rootish目录运行类似的操作:

#! /bin/bash
BASE_DIR=./

new_dir() {
LOC_DIR=`pwd`
for i in "${LOC_DIR}"/*; do
    [[ -f "${i}" ]] && cp "${i}" ../
    [[ -d "${i}" ]] && cd "${i}" && new_dir
cd ..
done
return 0
}

new_dir
这将搜索每个目录。当遇到一个文件时,它会将该文件复制到一个目录中。当找到一个目录时,它将向下移动到该目录中,并重新启动该过程。我想这对你有用


祝你好运。

我怀疑,当你说“复制”时,实际上是指将文件移动到各自的父目录。可以使用find轻松完成此操作:

$find-名称'*.txt'-type f-execdir mv-n'{}'../\; 上面的命令递归到当前目录中。然后对找到的每个项应用以下条件级联:

-名称“*.txt”将仅筛选出扩展名为.txt的文件 -类型f将只过滤掉常规文件,例如,不会过滤出名称以.txt结尾的目录(无论出于何种原因) -execdir mv-n'{}'../\;在包含目录中执行命令mv-n'{}'../,其中{}是匹配文件名的占位符,需要单引号来阻止shell解释花括号。这个终止命令,并且必须再次从解释命令的shell中转义。 我已将-n标志传递给mv程序,以避免意外覆盖现有文件

上面的命令将转换以下文件系统树

dir1/ 肮脏的/ file3.txt file4.txt 迪尔12/ file2.txt dir2/ 迪尔21/ 文件6.dat dir22/ 迪尔221/ dir221/file8.txt file7.txt file5.txt dir3/ 文件9.dat file1.txt 在这一点上:

dir1/ 肮脏的/ 迪尔12/ file3.txt file4.txt dir2/ 迪尔21/ 文件6.dat dir22/ 迪尔221/ file8.txt file7.txt dir3/ 文件9.dat file2.txt file5.txt 要清除空目录,请运行

$find-类型d-空-删除 同样,此命令将遍历当前目录。然后应用以下各项:

-这次键入d只过滤掉目录 -empty只过滤掉那些空的 -删除它们。 细节:-execdir不是由POSIX指定的,尽管至少GNU和BSD one的主要实现都支持它。如果您需要严格的POSIX遵从性,您将不得不使用不太安全的exec,这需要额外的考虑才能在这种情况下正确应用


最后,请在测试目录中使用虚拟文件(而不是实际数据)尝试您的命令。尤其是使用find的-delete选项,您可以比想象更快地释放所有数据。阅读,如果这还不够的话,还可以找到。如果你不懂,千万不要盲目地从互联网上随机发布的陌生人那里复制shell命令。

我怀疑,当你说“复制”时,你实际上是想将文件移动到各自的父目录。可以使用find轻松完成此操作:

$find-名称'*.txt'-type f-execdir mv-n'{}'../\; 上面的命令递归到当前目录中。然后对找到的每个项应用以下条件级联:

-名称“*.txt”将仅筛选出扩展名为.txt的文件 -类型f将只过滤掉常规文件,例如,不会过滤出名称以.txt结尾的目录(无论出于何种原因) -execdir mv-n'{}'../\;在包含目录中执行命令mv-n'{}'../,其中{}是匹配文件名的占位符,需要单引号来阻止shell解释花括号。这个终止命令,并且必须再次从解释命令的shell中转义。 我已将-n标志传递给mv程序,以避免意外覆盖现有文件

上面的命令将转换以下文件系统树

dir1/ 肮脏的/ file3.txt file4.txt 迪尔12/ file2.txt dir2/ 迪尔21/ 文件6.dat dir22/ 迪尔221/ dir221/file8.txt file7.txt file5.txt dir3/ 文件9.dat file1.txt 在这一点上:

dir1/ 肮脏的/ 迪尔12/ file3.txt file4.txt dir2/ 迪尔21/ 文件6.dat dir22/ 迪尔221/ file8.txt file7.txt dir3/ 文件9.dat file2.txt file5.txt 要清除空目录,请运行

$find-类型d-空-删除 同样,此命令将遍历当前目录。然后应用以下各项:

-典型 这次只过滤掉目录 -empty只过滤掉那些空的 -删除它们。 细节:-execdir不是由POSIX指定的,尽管至少GNU和BSD one的主要实现都支持它。如果您需要严格的POSIX遵从性,您将不得不使用不太安全的exec,这需要额外的考虑才能在这种情况下正确应用



最后,请在测试目录中使用虚拟文件(而不是实际数据)尝试您的命令。尤其是使用find的-delete选项,您可以比想象更快地释放所有数据。阅读,如果这还不够的话,还可以找到。如果你不懂,千万不要盲目地从互联网上随机发布的陌生人那里复制shell命令。

你可以试试mv*/*。我倾向于说,这应该深入研究。不过,您的问题的答案可能是rsync1。@SamiLaine您能提供更多的细节吗?:你总是有两级目录吗?您希望folderA中的文件发生什么情况?它应该留在那里还是搬到那里。?如果folder1包含更多的子目录,该怎么办?另外,我不确定你是想移动还是复制这些文件。你可以试试mv*/*。我倾向于说,这应该深入研究。不过,您的问题的答案可能是rsync1。@SamiLaine您能提供更多的细节吗?:你总是有两级目录吗?您希望folderA中的文件发生什么情况?它应该留在那里还是搬到那里。?如果folder1包含更多的子目录,该怎么办?还有,我不确定你是想移动还是复制这些文件。before/folderAfejese是的,它应该在那里,而不是我的解决方案。这只对福尔德拉有用。我需要一个解决方案,将文件复制到其直接父文件夹。它还应该同时适用于folderA和folderB及其所有子文件夹。谢谢,还是不是我想要的。可能是因为我英语不好。此解决方案仅适用于folder1文件,而不适用于folderA子文件夹和folderB。缺少。before/folderAfejese是的,它应该在那里,而不是我的解决方案。这只对福尔德拉有用。我需要一个解决方案,将文件复制到其直接父文件夹。它还应该同时适用于folderA和folderB及其所有子文件夹。谢谢,还是不是我想要的。可能是因为我英语不好。此解决方案仅适用于folder1文件,而不适用于folderA子文件夹和folderB。我不知道为什么您会说-execdir是GNU扩展名:。天哪,非常感谢,它工作得非常好。我花了很多时间想弄明白@谢谢,很高兴知道。但是在find的POSIX规范中,没有-execdir,所以我们不能在需要可移植的脚本中使用它。只需替换为false的GNU语句,并编写POSIX未指定-execdir。那就对了。我不知道你为什么说-execdir是GNU扩展:。天哪,非常感谢你,它工作得非常好。我花了很多时间想弄明白@谢谢,很高兴知道。但是在find的POSIX规范中,没有-execdir,所以我们不能在需要可移植的脚本中使用它。只需替换为false的GNU语句,并编写POSIX未指定-execdir。那就对了。