需要简单的BASH脚本:移动和重命名文件

时间:2016-01-06 22:14:47

标签: bash timestamp renaming

几十年前,我是一名程序员(IBM程序集,Fortran,COBOL,MS DOS脚本,一点Visual Basic。)因此,我熟悉IF-Then-Else,For循环等的一般性。

但是,我现在需要深入研究Bash以获得当前的工作,而且我在语法和适当的命令方面遇到了困难。

我需要一个简单的(概念性)脚本,它将:

  1. 确定用户桌面上是否存在特定文件夹(例如~/Desktop/Archive文件夹)
  2. 如果没有,请创建它(“存档”)
  3. 将桌面上的所有文件/文件夹(~/Desktop/Archive除外)移动到“存档文件夹” - 并将时间戳附加到要移动的文件名的末尾。
  4. 这是最后一篇文章 - 时间戳添加 - 这让我感到高兴。

    我希望能找到一个清晰简单的解决方案。这是我到目前为止所提出的:

    #!/bin/bash
    shopt -s extglob
    FOLDERARCH="Archive Folder"
    cd ~/Desktop
    if [ ! -d $"FOLDERARCH" ]; then
    mkdir "$FOLDERARCH"
    echo "$FOLDERARCH did not exist, was created"
    fi
    mv !(-d "$FOLDERARCH") "$FOLDERARCH"
    

    最后一点说明:上面的脚本有效(没有时间戳),但也以消息

    结束
    mv: rename Archive Folder to Folder/Archive Folder: Invalid argument
    

    为什么?

    任何帮助都将深深地,深深地感激。请假设我基本上知道关于BASH环境,cmds和他们的论点 - 这第一次请求帮助标志着我迈向至少精通的旅程的第一步。

    更新

    首先:非常感谢我收到的回复;他们非常有用。

    我现在已经得到它本质上是一个工作版本,但有一些奇怪的我不明白,经过几个小时的尝试研究,还没有理解/解决。

    我希望有一些见解;我觉得自己即将在理解方面取得一些进展,但这些异常现象阻碍了我的进步。到目前为止,这是我的(工作,带有“问题”)代码:

    shopt -s extglob
    FOLDERARCH="Archives"
    NEWARCH=$(date +%F_%T)
    cd ~/Desktop
    if [ ! -d $"FOLDERARCH" ]; then
        mkdir "$FOLDERARCH"
        echo "$FOLDERARCH did not exist, was created"
    fi
    mkdir "$FOLDERARCH/$NEWARCH"
    mv !(-d "$FOLDERARCH") $FOLDERARCH/$NEWARCH
    

    这实际上很大程度上实现了我的目标,但是:

    • 在桌面Archives文件夹已经存在的情况下,我希望if-then结构只是跟进(没有echo msg)到下面的mkdir命令,而是msg“Archives not exists” ,创建“msg输出无论如何(错误地)。关于为什么会有任何答案?

    • 脚本使用以下消息完成:

      mv: rename Archives to Archives/2016-01-10_00:06:54/Archives: Invalid argument
      

    我根本不明白这一点;应该发生的事情是桌面上除/Desktop/Archives文件夹之外的所有文件/文件夹都应该移动到/Desktop/Archives新创建的“子文件夹”,例如/Desktop/Archives/2016-01-10_00:06:54。事实上,这一举动实现了我的目标,但消息的产生对我来说毫无意义。什么是无效的论点?

    最后一点:在我的新手状态的这一点上,我正在寻找清晰易读的代码,而不是更优雅/复杂的单线管道命令解决方案。我期待着在适当的时候努力工作。

1 个答案:

答案 0 :(得分:2)

您有几种选择。其中一个最简单的方法是遍历~/Desktop下面的目录,如果它们不是"$FOLDERARCH",请将它们移到"$FOLDERARCH",例如:

for i in */; do
    [ "$i" != "$FOLDERARCH"/ ] && mv "$i" "$FOLDERARCH"
done

我还没有运行测试用例,但是类似于以下内容应该有效。

#!/bin/bash
shopt -s extglob
FOLDERARCH="Archive Folder"
cd ~/Desktop || { printf "failed to change to '~/Destop'\n"; exit 1; }
if [ ! -d "$FOLDERARCH" ]; then
    if mkdir "$FOLDERARCH" , then
        echo "$FOLDERARCH did not exist, was created"
    else
        echo "error: failed to create '$FOLDERARCH'"
        exit 1
    fi
fi

for i in */; do
    [ "$i" != "$FOLDERARCH"/ ] && mv "$i" "$FOLDERARCH"
done

我道歉,我忘记了 datestamp 部分。正如评论中所指出的,您可以包含 datestamp (根据您的喜好设置格式),其内容类似于以下内容:

tstamp=$(date +%s)
for i in */; do
    [ "$i" != "$FOLDERARCH"/ ] && mv "$i" "$FOLDERARCH/${i}_${tstamp}"
done