Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.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
Bash 将文件移动到unix中的特定文件夹_Bash_Shell_Unix - Fatal编程技术网

Bash 将文件移动到unix中的特定文件夹

Bash 将文件移动到unix中的特定文件夹,bash,shell,unix,Bash,Shell,Unix,我有一个脚本可以将.txt类型的文件移动到一个特定的文件夹中。它会在工作文件夹中查找文件并将其移动到完成的文件夹中。 我想使脚本通用,即增强脚本,使脚本不仅适用于一个特定文件夹,还适用于其他类似文件夹。 示例:如果在文件夹/tmp/swan/test/work和文件夹/tmp/swan/test11/work中有.txt文件,则文件应分别移动到/tmp/swan/test/done和/tmp/swan/test11/done。 编辑:另外,如果子文件夹(如/tmp/swan/test11/wor

我有一个脚本可以将.txt类型的文件移动到一个特定的文件夹中。它会在工作文件夹中查找文件并将其移动到完成的文件夹中。 我想使脚本通用,即增强脚本,使脚本不仅适用于一个特定文件夹,还适用于其他类似文件夹。 示例:如果在文件夹/tmp/swan/test/work和文件夹/tmp/swan/test11/work中有.txt文件,则文件应分别移动到/tmp/swan/test/done和/tmp/swan/test11/done。 编辑:另外,如果子文件夹(如/tmp/swan/test11/work/APX)中有一个.txt文件,该文件也应移动到/tmp/swan/test11/done

下面是当前脚本

  #!/bin/bash

  MY_DIR=/tmp/swan

  cd $MY_DIR

  find .  -path "*work*"  -iname "*.txt" -type f -execdir mv '{}' /tmp/swan/test/done \;
一种方法是:

背景:

$ tree
.
├── a
│   └── work
└── b
    └── work
find . -type f -name work -exec \
sh -c 'echo mv "$1" "$(dirname "$1")"/done' -- {} \;
mv ./a/work ./a/done
mv ./b/work ./b/done
重命名:

$ tree
.
├── a
│   └── work
└── b
    └── work
find . -type f -name work -exec \
sh -c 'echo mv "$1" "$(dirname "$1")"/done' -- {} \;
mv ./a/work ./a/done
mv ./b/work ./b/done
输出:

$ tree
.
├── a
│   └── work
└── b
    └── work
find . -type f -name work -exec \
sh -c 'echo mv "$1" "$(dirname "$1")"/done' -- {} \;
mv ./a/work ./a/done
mv ./b/work ./b/done
如果echo符合您的要求,您可以删除它。

关于:

find . -path '*work/*.txt' -exec sh -c 'd=$(dirname $(dirname $1))/done; mkdir -p $d; mv $1 $d' _ {} \;

(如果目标目录不存在,也会创建该目录)。

使用
-execdir
,将在文件所在的任何目录中执行
mv
命令。由于您只想将文件移动到“同级”目录,因此每个命令都可以使用相同的相对路径
。/done

find . -path "*work*"  -iname "*.txt" -type f -execdir mv '{}' ../done \;

如果它是同级目录,那么您提供的脚本可以正常工作,但是我在/tmp/swan/test11/work/APX文件夹中有一个.txt文件,我希望这个文件也被移动到/tmp/swan/test11/done。很抱歉,一开始我错过了这个细节。您是否正在使用
bash
4或更高版本?我正在使用bash版本3.2.25。使用您提供的脚本,当我尝试从/tmp/swan/test11/work/APX移动*.txt文件而不是移动到/tmp/swan/test11/doneNo文件夹时,它会在/tmp/swan/test11/work中创建一个.txt文件。如果您使用的是
bash
4,我将建议一个
查找
免费解决方案。