从脚本中运行ls时的不同行为

时间:2016-10-19 11:02:10

标签: bash ls

我想重命名一个以枚举方式命名的文件。我以前的方法是使用此命令行:

FILES=`ls "someDir/"`; for f in $FILES; do echo "Processing file: $f"; done;

Echoing文件名仅用于演示目的。以上产生了预期的输出:

Processing file: File1
Processing file: File2
Processing file: File3
...

然而,当我运行(我认为是同样的事情)下面的脚本时,它将整个ls输出视为一个文件并生成此输出:

SCRIPT:
#!/bin/bash
FILES=`ls "someDir/"`

for f in $FILES
do
    echo "Processing file: $f"
done

OUTPUT:
Processing file: File1
File2
File3
...

我无法理解它。此外,我甚至不确定是ls产生这种行为。 是什么导致了这种行为?为什么?

1 个答案:

答案 0 :(得分:2)

请参阅Why you shouldn't parse the output of ls(1),而不是使用process-substitution来处理命令输出。

find

上述简单find列出了所需目录中的所有文件(包括带空格/特殊字符的文件)。这里,stdin命令的输出被送到while-loop,由sort -z解析。

要对文件进行有序排序,请在find命令输出中添加#include <bsoncxx/builder/stream/document.hpp> #include <bsoncxx/types.hpp> #include <bsoncxx/json.hpp> #include <mongocxx/instance.hpp> #include <bsoncxx/json.hpp> #include <mongocxx/client.hpp> #include <mongocxx/stdx.hpp> #include <mongocxx/uri.hpp> struct Thing { mongocxx::client client; mongocxx::database db; mongocxx::collection coll; void open_connection(const char* host, const char* db_name, const char* coll_name) { mongocxx::instance inst{}; mongocxx::uri uri(host); client = mongocxx::client::client(uri); db = client[db_name]; coll = db[coll_name]; } }; int main() { Thing thing; thing.open_connection("mongodb://localhost:27017", "test", "insert_test"); auto builder = bsoncxx::builder::stream::document{}; bsoncxx::document::value doc_value = builder << "i" << 1 << bsoncxx::builder::stream::finalize; auto res = thing.coll.insert_one(doc_value.view()); //crashes return 0; } 管道。