如果$ DIR2没有相同的目录名,我试图将目录从$ DIR1移动到$ DIR2
if [[ ! $(ls -d /$DIR2/* | grep test) ]]
是我现在拥有的。
then
mv $DIR1/test* /$DIR2
fi
首先给出
ls: cannot access //data/lims/PROCESSING/*: No such file or directory
当$ DIR2为空时然而,它仍然有效。
其次 当我运行shell脚本两次。 它不允许我移动名称相似的目录。
例如,在$ DIR1中,我有test-1 test-2 test-3 当它第一次运行时,所有三个目录都移动到$ DIR2 之后我在$ DIR1做了mkdir test-4并再次运行脚本.. 它不会让我移动test-4,因为我的循环认为test-4已经存在,因为我抓住了所有的测试
如何绕过并移动测试-4?
答案 0 :(得分:1)
首先,您可以使用bash内置的“True if directory exists”表达式来检查目录是否存在:
test="/some/path/maybe"
if [ -d "$test" ]; then
echo "$test is a directory"
fi
但是,您想测试某些内容是否不是目录。您已在代码中显示您已经知道如何否定表达式:
test="/some/path/maybe"
if [ ! -d "$test" ]; then
echo "$test is NOT a directory"
fi
您似乎也在使用ls
来获取文件列表。如果文件不是目录,也许你想循环它们并做一些事情?
dir="/some/path/maybe"
for test in $(ls $dir);
do
if [ ! -d $test ]; then
echo "$test is NOT a directory."
fi
done
寻找像这样的bash东西的好地方是Machtelt Garrels的指南。 His page on the various expressions you can use in if statements给了我很多帮助。
如果目录中尚不存在目录,则将目录从源移动到目标:
为了便于阅读,我将DIR1
和DIR2
称为src
和dest
。首先,让我们声明它们:
src="/place/dir1/"
dest="/place/dir2/"
请注意尾部斜杠。我们将文件夹的名称附加到这些路径,以便尾部斜杠使这更简单。您似乎也在限制要移动的目录,无论他们的名字中是否有test
这个词:
filter="test"
所以,让我们首先遍历source
中传递filter
的目录;如果dest
中不存在它们,那就让它们移动到那里:
for dir in $(ls -d $src | grep $filter); do
if [ ! -d "$dest$dir" ]; then
mv "$src$dir" "$dest"
fi
done
我希望能解决你的问题。但是要注意,@gniourf_gniourf在评论中发布了一个应该注意的链接!
答案 1 :(得分:0)
如果您需要根据某种模式将某些目录复制到另一个目录,那么您可以使用find:
find . -type d -name "test*" -exec mv -t /tmp/target {} +
详细说明:
-type d - 将仅搜索目录
-name"" - 设置搜索模式
-exec - 使用查找结果执行某些操作
-t, - target-directory = DIRECTORY将所有SOURCE参数移到DIRECTORY
有许多exec或xargs用法的例子。
如果您不想覆盖文件,请将-n选项添加到mv命令:
find . -type d -name "test*" -exec mv -n -t /tmp/target {} +
-n, - no-clobber不会覆盖现有文件